package com.github.FelixCJF.coding2017.basic; public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[100]; public void add(Object o){ //容量增加 ensureCapacity(size + 1); //添加 elementData[size ++] = o; } public void add(int index, Object o){ //检查是否越界 rangeCheck(index); // 进行扩容检查 ensureCapacity(size + 1); // 对数组进行复制处理,目的就是空出index的位置插入element,并将index后的元素位移一个位置 System. arraycopy(elementData, index, elementData, index + 1, size - index); // 将指定的index位置赋值为Object o elementData[index] = o; // 自增一位长度 size++; } public Object get(int index){ rangeCheck(index); return elementData[index]; } public Object remove(int index){ // 数组越界检查 rangeCheck(index); // 取出要删除位置的元素,供返回使用 Object oldValue = elementData[index]; // 计算数组要复制的数量 int numMoved = size - index - 1; // 数组复制,就是将index之后的元素往前移动一个位置 if (numMoved > 0) System. arraycopy(elementData, index+1, elementData, index, numMoved); // 将数组最后一个元素置空(因为删除了一个元素,然后index后面的元素都向前移动了,所以最后一个就没用了),好让gc尽快回收 // 不要忘了size减一 elementData[--size] = null; return oldValue; } public int size(){ return size; } public Iterator iterator(){ return new ArrayListIterator(); } //内部类,实现Iterator private class ArrayListIterator implements Iterator{ private int currentIndex = 0; //当前索引 public boolean hasNext() { if (currentIndex >= size) { return false; } return true; } public Object next() { Object object = elementData[currentIndex]; currentIndex ++ ; return object; } } //扩容 public void ensureCapacity( int minCapacity) { // 当前数组的长度 int oldCapacity = elementData .length; // 最小需要的容量大于当前数组的长度则进行扩容 if (minCapacity > oldCapacity) { // 扩容 int newCapacity = oldCapacity + (oldCapacity >> 1); // 如果新扩容的数组长度还是比最小需要的容量小,则以最小需要的容量为长度进行扩容 if (newCapacity < minCapacity) newCapacity = minCapacity; //数组复制 Object[] elementData2 = new Object[newCapacity]; for (int i = 0; i < oldCapacity; i++) { elementData2[i] = elementData[i]; } elementData = elementData2; } } //检查是否越界 private void rangeCheck(int index){ if (index < 0 || index >= this.size) { throw new IndexOutOfBoundsException("index :" + index + "size :" + size); } } }