package com.coding.basic; import java.util.Arrays; public class ArrayList implements List { private static final int INI_SIZE = 100; private static final int EXTENDED_SIZE = 100; // 每次扩容的大小 private int size = 0; private Object[] elements = new Object[INI_SIZE]; @Override public void add(int index, Object o) { if (size < 1) { index = 0; } else { if (index < 0) { index = 0; } if (index > size - 1) { index = size - 1; } } ensureCapacity(); for (int i = size - 1; i >= index; i--) { elements[i + 1] = elements[i]; } elements[index] = o; size++; } @Override public void add(Object o) { ensureCapacity(); elements[size] = o; size++; } @Override public Object get(int index) { if (size < 1 || index < 0 || index > size - 1) { throw new IndexOutOfBoundsException(); } return elements[index]; } @Override public Object remove(int index) { if (size < 1 || index < 0 || index > size - 1) { throw new IndexOutOfBoundsException(); } Object object = elements[index]; for (int i = index; i < size - 1; i++) { elements[i] = elements[i + 1]; } elements[size - 1] = null; size--; adjustCapacity(); // 调整数组至合适大小 return object; } @Override public int size() { return size; } // 底层数组最多有2*EXTENDED_SIZE个多余空间 private void adjustCapacity() { if ((size + 2 * EXTENDED_SIZE) < elements.length) { elements = Arrays.copyOf(elements, size + 2 * EXTENDED_SIZE); } } // 每次添加元素时,检查底层数组的长度,保证存储空间 private void ensureCapacity() { if (size == elements.length) { elements = Arrays.copyOf(elements, elements.length + EXTENDED_SIZE); } } public Iterator iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator { private int curIndex = 0; @Override public boolean hasNext() { if (size > 0 && curIndex < size) { return true; } return false; } @Override public Object next() { if (!hasNext()) { throw new IndexOutOfBoundsException(); } Object object = elements[curIndex]; curIndex++; return object; } } }