package com.xxt.DataStructure; import java.util.ArrayList; import java.util.Arrays; /** * Created by star on 2017/2/26. */ public class MyArrayList implements List { private Object[] elementData; private int size = elementData.length; public MyArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else { throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); } } public MyArrayList() { this(10); } @Override public void add(Object o) { ensureCapacity(size + 1); elementData[size + 1] = o; } @Override public void add(int index, Object o) { //判断数组下标是否越界 if(index < 0 || index > elementData.length){ throw new IndexOutOfBoundsException("index : "+index+"size : "+size); } ensureCapacity(index); System.arraycopy(elementData, index,elementData, index + 1, size - index); elementData[index] = o; size++; } @Override public Object get(int index) { return elementData[index]; } @Override public Object remove(int index) { //判断数组下标是否越界 if(index < 0 || index > elementData.length){ throw new IndexOutOfBoundsException("index : "+index+"size : "+size); } //取出删除的值 Object oldValue = elementData[index]; //做删除操作同样是复制数组 //计算要删除的数量 int numMoved = size - index - 1; if ( numMoved > 0){ System.arraycopy(elementData, index + 1, elementData, index, numMoved); } //将数组最后一个元素置为空,让GC回收 elementData[size - 1] = null; return oldValue; } @Override public int size() { return elementData.length; } //判断是否扩容 public void ensureCapacity(int minCapacity) { //取得当前数组容量 int currentCapacity = elementData.length; //如果最小需要的容量小于当前数组容量则需要扩容 if (minCapacity < currentCapacity) { int newCapacity = currentCapacity + (currentCapacity >> 1); //如果扩容后的长度还是小于最小需要的长度,则直接以最小需要的长度作为当前数组的长度 if (newCapacity < minCapacity) { newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); } } } }