使用无参构造函数新建的ArrayList的容量
List<Integer> list =new ArrayList<Integer>();
这个ArrayList的容量是10,从源码中即可得知:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
ArrayList的最大容量为多少
从源码中可以得知ArrayList的最大容量为:Integer.MAX_VALUE - 8
/** * The maximum size of array to allocate. * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
那么为什么是Integer.MAX_VALUE - 8呢,这段源码告诉了我们,有些虚拟机在阵列中保留一些头信息,防止内存溢出,
此时,我们发现ArrayList最大容量是(Integer.MAX_VALUE-8)
ArrayList的最大容量为什么是Integer.MAX_VALUE - 8,而不是减其他数
数组对象的形状和结构(如int值数组)与标准Java对象类似。主要区别在于数组对象有一个额外的元数据,用于表示数组的大小。然后,数组对象的元数据由以下部分组成:Class:指向描述对象类型的类信息的指针。在int数组的情况下,这是一个指向int []类的指针。
标志:描述对象状态的标志集合,包括该对象的散列码(如果有)以及对象的形状(即对象是否为数组)。
锁定:对象的同步信息 - 即对象是否当前同步。
大小:数组的大小。
作为自己需要8 bytes存储大小 所以是Integer.MAX_VALUE-8