package ArrayList; /** * <p>MyArrayList是个动态数组,初始容量为10的空列表</p> * <p>在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量.这可 * 以减少递增式再分配的数量</p> * @author baby69yy2000 */ public class MyArrayList<T> { private T[] listArr; private int listSize;
/** * 构造一个初始容量为10的空列表 */ public MyArrayList() { listArr = (T[]) new Object[10]; listSize = 0; }
/** * <p>方法ensureCapacity是MyArrayList类实现的一个重要操作, 它提供了允许ArrayList对象 * 进行动态增长的存储空间管理工具</p> * <p>在MyArrayList对象的大小等于其容量时, 分配一个更大的数组, 并将已有值复制到新数组中</p> * @param minCapacity 所需的最小容量 */ public void ensureCapacity(int minCapacity) { int currentCapacity = listArr.length; if(minCapacity > currentCapacity) { T[] oldlistArr = listArr; listArr = (T[]) new Object[minCapacity]; for (int i = 0; i < listSize; i++) { listArr[i] = oldlistArr[i]; } oldlistArr = null; } }
/** * 将此 MyArrayList 实例的容量调整为列表的当前大小 */ public void trimToSize() { int oldCapacity = listArr.length; if(listSize < oldCapacity) { T[] oldlistArr = listArr; listArr = (T[]) new Object[listSize]; for (int i = 0; i < listSize; i++) { listArr[i] = oldlistArr[i]; } oldlistArr = null; } }
/** * MyArrayList的连接 * 把listB放到listA的末尾 */ public static <T> void joinList(MyArrayList<T> listA, MyArrayList<T> listB) { int sizeA = listA.size(), sizeB = listB.size(); listA.ensureCapacity(sizeA + sizeB); for(int i = 0; i < sizeB; i++) listA.add(listB.get(i)); }
/** * 求listArr的长度 * @return listArr长度 */ public int listArrLength() { return listArr.length; }
/** * 数组下标越界检查函数 */ private void rangeCheck(int index, String s, int upperBound) { if(index < 0 || index >= upperBound + 1) { throw new IndexOutOfBoundsException("\n" + s + ": index" + index + "out of bounds. Should be in the range 0 to " + upperBound); } }
/** * 将指定的元素插入此列表中的指定位置.向右移动当前位于该位置的元素(如果有)以及所有后续元素 * (将其索引加 1) * @param index 指定元素所插入位置的索引 * @param item 要插入的元素 * @throws IndexOutOfBoundsException */ public void add(int index, T item) { rangeCheck(index, "MyArrayList add()", listSize);