package week01.basic; import java.util.Arrays; public class MyArrayList 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) { checkPositionIndex(index); ensureCapacity(size + 1); if (index >= size) { elementData[size++] = o; } else { System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; size++; } } public Object get(int index) { checkElementIndex(index); return elementData[index]; } public Object remove(int index) { checkElementIndex(index); Object removeElement = elementData[index]; if (index == (size - 1)) { elementData[index] = null; size--; } else { System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); elementData[size - 1] = null; size--; } return removeElement; } public int size() { return size; } /** * 保证数组空间充足 * * @param minCapacity */ private void ensureCapacity(int minCapacity) { int capacity = elementData.length; if (minCapacity > capacity) { capacity += capacity / 2; grow(capacity); } } private void checkElementIndex(int index) { if (!isElementIndex(index)) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } private boolean isElementIndex(int index) { return index >= 0 && index < size; } private void checkPositionIndex(int index) { if (!isPositionIndex(index)) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } private boolean isPositionIndex(int index) { return index >= 0 && index <= size; } private void grow(int newCapacity) { elementData = Arrays.copyOf(elementData, newCapacity); } public Iterator iterator() { return new ArrayListIterator(this); } private class ArrayListIterator implements Iterator { private MyArrayList list; private int position = 0; private ArrayListIterator(MyArrayList list) { this.list = list; } @Override public boolean hasNext() { if ((position + 1) > size) { return false; } return true; } @Override public Object next() { return list.get(position++); } } @Override public String toString() { String elementStr = ""; for (int i = 0; i < size; i++) { elementStr += elementData[i] + ","; } return "MyArrayList: { size=" + size + ", elementData=" + "[" + elementStr.substring(0, elementStr.length() - 1) + "]" + " }"; } }