package cmj.datastructure.list; import java.util.Arrays; import java.util.Collection; public class ArrayList implements List { private transient Object[] elementData; private int size; /** * ArrayList初始化无参数构造函数 */ public ArrayList() { this(10); } /** * ArrayList带容量的构造函数 * * @param initialCapacity初始化容量 */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); // 新建一个数组 this.elementData = new Object[initialCapacity]; } /** * 检查数组的容量 * * @param neededMinCapacity所需最小的容量 */ public void ensureCapacity(int neededMinCapacity) { int currCapacity = elementData.length;// 获取当前数据的全部容量 // 需要扩容的情况 if (neededMinCapacity > currCapacity) { int newCapacity = (currCapacity * 3) / 2 + 1;// 计算新的容量 elementData = Arrays.copyOf(elementData, newCapacity); } } /** * 添加数据 * * @param o要添加的元素 * @return 是否添加成功 */ public void add(Object o) { // 确定ArrayList的容量大小 ensureCapacity(size + 1); // Increments modCount!! // 添加o到ArrayList中 elementData[size++] = o; } /** * 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。 * * @param index要用于检查的索引 */ private void RangeCheck(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException("Index: " + index + " 超出访问范围"); } /** * 向指定的位置添加元素 * * @param index * @param o */ public void add(int index, Object o) { RangeCheck(index); ensureCapacity(size + 1);// 检查容量 /* 将原数组从第index个位置复制到原数组第index+1个位置上,一共移动size-index(也就是后面剩下的)个元素 */ System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; size++; } public boolean addAll(Collection<? extends Object> c) { Object[] a = c.toArray(); int growthNum = a.length; ensureCapacity(size + growthNum); // Increments modCount System.arraycopy(a, 0, elementData, size, growthNum); size += growthNum; return growthNum != 0; } public Object get(int index) { RangeCheck(index); return elementData[index]; } public Object remove(int index) { RangeCheck(index); int numMoved = size - index - 1;// 删除后需要移动的对象 Object RemovedValue = elementData[index]; if (numMoved > 0) System.arraycopy(elementData, index + 1, elementData, index, numMoved); elementData[--size] = null; return RemovedValue; } public int size() { return size; } @Override public String toString() { String arraylist = "["; for (int i = 0; i < size; i++) { if (i == size - 1) { arraylist += elementData[i].toString() + "]"; } else { arraylist += elementData[i].toString() + " ,"; } } return arraylist; } public static void main(String[] args) { ArrayList arrayList = new ArrayList(5); arrayList.add(1); arrayList.add(2); arrayList.add(3); arrayList.add(4); arrayList.add(5); arrayList.add(6); System.out.println(arrayList); arrayList.add(1, 1234); System.out.println(arrayList); arrayList.remove(1); System.out.println(arrayList); System.out.println(arrayList.get(5)); ArrayList stringArraylist = new ArrayList(3); stringArraylist.add("Hello "); stringArraylist.add("string "); stringArraylist.add("arraylist"); System.out.println(stringArraylist); ArrayList mixArraylist = new ArrayList(5); mixArraylist.add("String"); mixArraylist.add(1); mixArraylist.add('f'); mixArraylist.add(3.1f); mixArraylist.add(4L); System.out.println(mixArraylist); } }