package com.github.zhanglifeng.coding2017.basic; import java.util.*; /** * 功能:实现ArrayList. * @author zhanglifeng. */ public class ArrayList implements List { private int size = 0; //当前数组大小 private Object[] elementData = new Object[5]; //初始数组 /** * 将对象o添加到ArrayList中. * @param o:需要添加的对象. */ public void add(Object o) { ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素,如果不够则扩容 elementData[size] = o; //将o添加到数组中 size++; //数组大小增加1 } /** * 将对象o添加到ArrayList的指定位置. * @param index: 指定位置. * @param o: 需要添加的对象. */ public void add(int index, Object o) { rangeCheck(index); //判断指定的位置index是否合法 ensureCapacity(size + 1); //确保数组的容量可以装的下size + 1个元素,如果不够则扩容 System.arraycopy(elementData, index, elementData, index + 1, size - index); //将index位置到结束位置所有的数组往后移动一个位置 elementData[index] = o; //将对象o添加到index位置 size++;//数组大小增加1 } public Object get(int index) { rangeCheck(index); return elementData[index]; } public Object remove(int index) { rangeCheck(index); if (index != elementData.length - 1) { System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index); } size--; return elementData; } public int size() { return size; } public Iterator iterator() { return new ArrayListIterator(this); } private void ensureCapacity(int number) { if (number > elementData.length) { elementData = grow(elementData, 1); } } public Object[] grow(Object[] src, int step) { Object[] target = new Object[src.length + step]; System.arraycopy(src, 0, target, 0, src.length); return target; } public void rangeCheck(int index){ if (index > size || index < 0) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } private class ArrayListIterator implements Iterator { ArrayList arrayList = null; int current = 0; private ArrayListIterator(ArrayList arrayList) { this.arrayList = arrayList; } @Override public boolean hasNext() { current++; return current > arrayList.size() ? false : true; } @Override public Object next() { return elementData[current]; } } public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("s1"); arrayList.add("s2"); arrayList.add("s3"); arrayList.add("s4"); arrayList.add(3, "s33"); arrayList.add("s5"); System.out.println(arrayList.size()); System.out.println(arrayList.get(2)); arrayList.remove(3); System.out.println(arrayList.size()); arrayList.add("s1"); System.out.println(arrayList.size()); arrayList.remove(5); System.out.println(arrayList.size()); Iterator it = arrayList.iterator(); while(it.hasNext()){ System.out.print(it.next() + " "); } System.out.println(); } }