ArrayList的最大容量

3,141 阅读1分钟

使用无参构造函数新建的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