package com.coding.weak1; public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[100]; public void add(Object o){ ensureCapcity(size + 1); elementData[size++] = o; } /** * 当数组长度不够时进行扩容 */ private void ensureCapcity(int requireSize){ int oldCapacity = elementData.length; int newCapacity ; if(oldCapacity < requireSize){ newCapacity = oldCapacity + (oldCapacity >> 1); if(newCapacity < 0){ newCapacity = Integer.MAX_VALUE; } if(newCapacity > Integer.MAX_VALUE - 8){ newCapacity = Integer.MAX_VALUE; } Object[] elementDataNew = new Object[newCapacity]; System.arraycopy(elementData, 0, elementDataNew, 0, oldCapacity); elementData = elementDataNew; } } public void add(int index, Object o){ indexCheckForAdd(index); ensureCapcity(index + 1); Object[] newElementData = new Object[elementData.length]; if(index > 0) System.arraycopy(elementData, 0, newElementData, 0, index-1); System.arraycopy(elementData, index, newElementData, index+1, size-index); elementData = newElementData; elementData[index] = o; size++; } private void indexCheckForAdd(int index) { if(index < 0 || index >= size-1){ throw new IndexOutOfBoundsException("max index is: "+(size-1)); } } public Object get(int index){ indexCheck(index); return elementData[index]; } private void indexCheck(int index) { if(index < 0 || index > size-1){ throw new IndexOutOfBoundsException("max index is: "+(size-1)); } } public Object remove(int index){ indexCheck(index); Object obj = elementData[index]; System.arraycopy(elementData, index+1, elementData, index, size-index-1); elementData[size--] = null; return obj; } public int size(){ return size; } public Iterator iterator(){ return new ListIter(); } private class ListIter implements Iterator{ private int cursor; @Override public boolean hasNext() { return cursor < size; } @Override public Object next() { int index = cursor; if(index >= size) throw new IndexOutOfBoundsException(); cursor++; return elementData[index]; } } }