public abstract class AbstractList{ //操作数:元素个数发生改变时,改变了才++ //作用:对集合操作(添加、删除)一次,就++一次 protected transient int modCount = 0;//2 } public class ArrayList extends AbstractList implements List { //默认初始化容量 private static final int DEFAULT_CAPACITY = 10; //空内容的数组(长度为0) private static final Object[] EMPTY_ELEMENTDATA = {}; //空内容的数组(长度为0) private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //容器(ArrayList集合中所有的元素都是存在这个一维数组里的) transient Object[] elementData;//new Object[10] //元素个数(指针) private int size;//2 //数组最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } //initialCapacity - 100 public ArrayList(int initialCapacity) { //验证初始化容量的合法性 if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } //e - xxx public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } //minCapacity - 11 private void ensureCapacityInternal(int minCapacity) { //使用无参构造创建对象时,第一次添加元素就会进入的判断 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //minCapacity - 10 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } //minCapacity - 11 private void ensureExplicitCapacity(int minCapacity) { modCount++; // 有溢出意识的代码 -- 判断是否可以扩容(要扩容的长度必须大于原数组的长度) if (minCapacity - elementData.length > 0) grow(minCapacity); } //minCapacity - 11 private void grow(int minCapacity) { // 有溢出意识的代码 -- 计算扩容的容量 //oldCapacity - 10 int oldCapacity = elementData.length; //newCapacity - 15 int newCapacity = oldCapacity + (oldCapacity >> 1); //newCapacity - 15 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; //判断新容量是否大于 数组的最大容量 if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // 扩容 elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } }
ArrayListlist = new ArrayList<>(); //ArrayList list = new ArrayList<>(100); list.add("鱼鱼鱼"); list.add("菜菜菜"); list.add("呜呜呜");
ArrayList底层数据结构是什么?
Object类型的一维数组
ArrayList初始化容量是多少?
使用无参构造创建ArrayList时,会将数组先赋值成没有长度的空数组
使用有参构造创建ArrayList时,如果参数大于0则创建参数长度的数组,如果参数等于0会将数组
赋值成没有长度的空数组,如果参数小于0就会报错
ArrayList底层有个变量规定初始化容量为10,如果使用无参构造创建ArrayList对象,第一次添加元素时,会将底层的Objec类型的一维数组初始化为10长度的数组
ArrayList的扩容机制?
是原数组的1.5倍
ArrayList数组最大容量是多少?
Integer.MAX_VALUE-8
ArrayList数组最大容量为什么是Integer.MAX_VALUE-8?
因为-8的位置要去存储数组的头部信息(内存地址、元素类型、数组长度…)



