package com.my.list; /** * 实现ArrayList * */ public class ArrayList { //初始化容量 private static final int INIT = 5; //增长因子 private static final double GROWTH = 0.5; //初始化数组 Object[] baseArr = new Object[INIT]; //当前下标 int currentIndex = 0; //最大下标 int maxIndex = INIT-1; /** * 添加元素 * @param obj * @return */ public Object add(Object obj){ if(judgeCapacity()){ baseArr = arrayDilatation(baseArr, GROWTH); maxIndex = baseArr.length-1; } baseArr[currentIndex] = obj; ++currentIndex; return obj; } /** * 指定下标添加元素 * @param index * @param obj * @return */ public Object add(int index , Object obj){ if (index < 0 || index > currentIndex) { throw new IndexOutOfBoundsException(); } Object[] dest = new Object[currentIndex+1]; System.arraycopy(baseArr, 0, dest, 0, index); dest[index] = obj; System.arraycopy(baseArr, index, dest, index+1, currentIndex-index); ++currentIndex; baseArr = dest; return obj; } /** * 指定下标删除元素 * @param index * @return */ public Object remove(int index){ if (index < 0 || index >= currentIndex) { throw new IndexOutOfBoundsException(); } Object object = baseArr[index]; Object[] dest = new Object[currentIndex]; System.arraycopy(baseArr, 0, dest, 0, index); System.arraycopy(baseArr, index+1, dest, index, currentIndex-index-1); --currentIndex; baseArr = dest; return object; } /** * 根据下标获取元素 * @param index * @return */ public Object get(int index){ return baseArr[index]; } /** * 获取集合大小 * @return */ public int size(){ return currentIndex; } /** * 判断容量是否需要增加 * @return */ public boolean judgeCapacity(){ if(currentIndex > maxIndex){ return true; } return false; } /** * 数组扩容 * @param objArr * @param groth * @return */ public static Object[] arrayDilatation(Object[] objArr , double groth){ int length = objArr.length; int newLength = (int) (length * groth + length); Object[] baseArr = new Object[newLength]; System.arraycopy(objArr, 0, baseArr, 0, length); return baseArr; } }