package io.renren; import java.util.Arrays; public class ExtArrayList { // list 底层 采用数组存放 private Object[] elementData; //默认容量大小 private static final int DEFAULT_CAPACITY = 10; //实际arraylist大小 private int size; //初始化容量大小 public ExtArrayList(int initialCapacity){ if(initialCapacity<0){ throw new RuntimeException(); } elementData = new Object[initialCapacity]; } public ExtArrayList(){ this(10); } public void add(Object object){ if(size == elementData.length){ /* Object[] newObj = new Object[2 * size]; for (int i = 0; i < elementData.length; i++) { newObj[i] = elementData[i]; } elementData = newObj;*/ //简略的扩容 //elementData = Arrays.copyOf(elementData,size*2); int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); // 在原来容量的基础上加上 // 如果初始化的集合长度为1 则与运算 算出的结果扩容还是1 会报错,数组越界,则需要以下判断 // size 是记录当前集合的元素个数,在扩容成功的基础上至少是个数+1 不会报错,所以有如下处理 int minCapacity = size + 1; if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; // 最少保证容量和minCapacity一样 } elementData = Arrays.copyOf(elementData,newCapacity); } elementData[size++]=object; } //获取数据 public Object get(int index){ if(index > size){ throw new RuntimeException(); } return elementData[index]; } public Object remove(int index){ //判断是否存在 Object o = get(index); // 计算删除元素后面的长度 int numMoved = elementData.length - index - 1; if(numMoved>0){ System.arraycopy(elementData,index+1,elementData,index,numMoved); } elementData[--size] = null; return o; } }