package com.coding.basic; import java.util.List; public class ArrayList implements List{ private int size; //设置一个默认容量,当调用默认构造函数实例化数组后,需要扩容时可用 private static final int DEFAULT_CAPACITY=10; //Integer.MAX_VALUE:2147483647,MAX_ARRAY_SIZE:2147483639 private static final int MAX_ARRAY_SIZE=Integer.MAX_VALUE-8; private Object[] elementData; //定义一个默认为空的数组,供默认构造函数使用 private static final Object[] EMPTY_ELEMENTDATA={}; //定义默认构造函数,实例化为空数组 public ArrayList(){ this.elementData=EMPTY_ELEMENTDATA; } //定义一个有参的构造函数 public ArrayList(int initialCapacity){ if(initialCapacity<0) throw new IllegalArgumentException("Illegal Capacity:"+initialCapacity); this.elementData = new Object[initialCapacity]; } //定义add(Object o)方法,默认在数组末尾添加 public boolean add(Object o){ //要添加一个数,所以用ensureCapacityInternal()判断size+1个的数,数组是否放得下 ensureCapacityInternal(size+1); elementData[size++]=o; return true; } private void ensureCapacityInternal(int minCapacity) { if(elementData == EMPTY_ELEMENTDATA) minCapacity = DEFAULT_CAPACITY; //如果需要扩容,则调用grow() if(minCapacity-elementData.length>0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity+(oldCapacity>>1); //原始长度是0时,即原来是空数组时 if(newCapacity-minCapacity<0) newCapacity = minCapacity; //如果新的容量超过了数组最大容量,就调用hugeCapacity()把能给的最大容量给它 if(newCapacity-MAX_ARRAY_SIZE>0) newCapacity = hugeCapacity(minCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity<0) { throw new OutOfMemoryError(); //抛出内存溢出异常 } //如果minCapacity比MAX_ARRAY_SIZE大,则返回int类型所能表示的最大值,否则返回MAX_ARRAY_SIZE return (minCapacity>MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } }