/** * */ package com.coding.basic; /** * @author patchouli * */ public class ArrayList implements List { /** * 数组列表初始默认容量100. */ private static final int DEFAULT_CAPACITY=100; /** * 数组列表中元素的数量。 */ private int size = 0; /** * 数组列表当前容量 */ private int capacity; /** * 存放元素的数组。 */ private Object[] elementData; /** * 默认构造函数,构造一个初始容量为100的数组列表 */ public ArrayList() { capacity=DEFAULT_CAPACITY; elementData=new Object[DEFAULT_CAPACITY]; } /* * (non-Javadoc) * * @see nusub.coding2017.basic.List#add(java.lang.Object) */ @Override public void add(Object o) { expand(); elementData[size]=o; size=size++; } /* * (non-Javadoc) * * @see nusub.coding2017.basic.List#add(int, java.lang.Object) */ @Override public void add(int index, Object o) throws ListIndexException { if (index==size) { add(o); return; } if (0<=index&&index<size) { expand(); for (int i = size; i>index; i--) { elementData[i]=elementData[i-1]; } elementData[index]=o; return; } throw new ListIndexException("index不在[0,size]之间"); } /** * index在[0,size)之间返回通过数组下标访问的方式获取位置index处的元素,index超出这个范围抛出ListIndexException。 * @param index 元素的位置 * @return 获取的对象 * @throws ListIndexException */ @Override public Object get(int index) throws ListIndexException { if (0<=index&&index<size) { return elementData[index]; } throw new ListIndexException("index不在[0,size)之间"); } /** * 通过访问数组下标删除[0,size)之间的元素,被删除的元素之后的元素向前移动。如果index超出这个范围,抛出ListIndexException。 * @param index 要删除大额元素的位置 * @return 被删除的对象 * @throws ListIndexException */ @Override public Object remove(int index) throws ListIndexException { if (0<=index&&index<size) { throw new ListIndexException("index不在[0,size)之间"); } Object object=elementData[index]; for(int i=index;i<size;i++){ elementData[i]=elementData[i+1]; } shrink(); return object; } /* * (non-Javadoc) * * @see nusub.coding2017.basic.List#size() */ @Override public int size() { return size; } /** * 空间不足时扩容,容量变为原来的2倍,在添加元素前调用。 */ private void expand(){ if (size<DEFAULT_CAPACITY) { return; } capacity=capacity*2; Object[] oldElementData=elementData; elementData=new Object[capacity]; for (int i = 0; i < size; i++) { elementData[i]=oldElementData[i]; } } /** * 装填因子小于25%时收缩,容量变为原来的50%,但不小于初始容量。在移除元素后使用。 */ private void shrink(){ if (capacity<DEFAULT_CAPACITY*2) { return; } if (size*4<capacity) { capacity=capacity/2; Object[] oldElement=elementData; elementData=new Object[capacity]; for (int i = 0; i < size; i++) { elementData[i]=oldElement[i]; } } } }