JavaArrayList简单实现

    技术2026-01-23  5

    话不多说直接上代码

    public interface List<E> extends Iterable<E>{ //获取当前线性表的最大容量 public int getCapacity(); //获取线性表中有效元素的个数 public int size(); //判断线性表是否为空 public boolean isEmpty(); //在表尾添加元素 public void add(E e) ; //在指定索引处添加元素 public void add(int index,E e); //删除指定元素 public void remove(E e); //删除指定索引的元素 public void remove(int index); //修改指定索引的元素,返回该位置原来的元素 public E set(int index,E e); //获取指定元素的索引 public int indexOf(E e); //判断线性表是否包含指定元素 public boolean contains(E e); //获取指定索引的元素 public E get(int index); //清空线性表 public void clear(); //根据指定迭代器对线性表进行排序 public void sort(Comparator<E> comparator); //获取子表 public List<E> subList(int fromIndex,int endIndex); } public class ArrayList<E> implements List<E>{ //首先我们必须有一个数组存放数据 private E[] data; //存放有效元素的个数 private int size; //默认的初始容量 private static final int DEFAULT_CAPACITY=10; public ArrayList(int size) { if(size<DEFAULT_CAPACITY) { throw new IllegalArgumentException("size can not < 10"); } data=(E[])new Object[size]; size=0; } public ArrayList() { this(DEFAULT_CAPACITY); } public ArrayList(E[] arr) { if(arr==null||arr.length==0) { throw new IllegalArgumentException("arr can not to be null"); } data=(E[])new Object[DEFAULT_CAPACITY]; for(int i=0;i<arr.length;i++) { add(arr[i]); } } @Override public int getCapacity() { return data.length; } @Override public int size() { return size; } @Override public boolean isEmpty() { return size==0; } //该方法其实等同于指定在表尾添加元素 @Override public void add(E e) { add(size,e); } @Override public void add(int index, E e) { if(index<0||index>size) { throw new IndexOutOfBoundsException("index is illegal in method add"); } if(size==data.length) { //每次以两倍扩容 resize(size*2); } for(int i=size;i>index;i--) { data[i]=data[i-1]; } data[index]=e; size++; } private void resize(int newLen) { E[] newData=(E[])new Object[newLen]; for(int i=0;i<size;i++) { newData[i]=data[i]; } data=newData; } @Override public void remove(E e) { remove(indexOf(e)); } @Override public void remove(int index) { if(index<0||index>=size) { throw new IndexOutOfBoundsException("index is illegal in method remove"); } for(int i=index;i<size-1;i++) { data[i]=data[i+1]; } size--; if(size<data.length/4&&data.length>10) { resize(data.length/2); } } @Override public E set(int index, E e) { if(index<0||index>=size) { throw new IndexOutOfBoundsException("index is illegal in method set"); } E old=data[index]; data[index]=e; return old; } @Override public int indexOf(E e) { for(int i=0;i<size;i++) { if(data[i].equals(e)) { return i; } } return -1; } @Override public boolean contains(E e) { return indexOf(e)!=-1; } @Override public E get(int index) { if(index<0||index>=size) { throw new IndexOutOfBoundsException("index is illegal in method set"); } return data[index]; } @Override public void clear() { data=(E[]) new Object[DEFAULT_CAPACITY]; size=0; } @Override public void sort(Comparator<E> comparator) { for(int i=0;i<size;i++) { E temp=data[i]; int j; for(j=i;j>0&&comparator.compare(data[j-1], temp)>0;j--) { data[j]=data[j-1]; } data[j]=temp; } } @Override public List<E> subList(int fromIndex, int endIndex) { if(fromIndex>endIndex) { throw new IllegalArgumentException("fromIndex can not upper to endIndex"); } if(fromIndex<0) { throw new IllegalArgumentException("fromIndex can not <0"); } if(endIndex>=size) { throw new IllegalArgumentException("endIndex can not >=size"); } List<E> list=new ArrayList<>(DEFAULT_CAPACITY); for(int i=fromIndex;i<=endIndex;i++) { list.add(data[i]); } return list; } @Override public Iterator<E> iterator() { Iterator<E> itertor =new Iterator<E>() { private int index; @Override public boolean hasNext() { return index<size; } @Override public E next() { return data[index++]; } }; return itertor; } @Override public String toString() { StringBuilder str=new StringBuilder(); str.append("["); if(size==0) { str.append("]"); }else { for(int i=0;i<size;i++) { str.append(data[i]); if(i!=size-1) { str.append("、"); }else { str.append("]"); } } } str.append(size+"/"+data.length); return str.toString(); } }
    Processed: 0.014, SQL: 9