java arraylist大小,java arraylist最大值
00-1010 Arraylist的最大长度Max _ array _ size of Arraylist=integer . Max _ value-8;Arraylist的最大长度是2147483647,也就是2 ^ 31-1 Arraylist的扩展问题。数组列表有两种容量:1。无参数的构造方法;2.带参数的构造方法。
目录
Arraylist的最大长度
最近在学习java基础知识和学习集合的时候,在看ArrayList的源代码的时候发现了一个有趣的事情。
ArrayList集合的最大长度是多少?
/** *要分配的最大数组大小。*一些虚拟机在数组中保留一些头字。*尝试分配更大的数组可能会导致* OutOfMemoryError:请求的数组大小超过虚拟机限制*/private static final int MAX _ ARRAY _ SIZE=Integer。MAX _ VALUE-8;/** *增加容量,以确保它至少可以容纳由最小容量参数指定的*个元素。* * @param minCapacity所需的最小容量*/private void grow(int min capacity){//溢出感知代码int old capacity=element data . length;int new capacity=old capacity(old capacity 1);if(new capacity-min capacity 0)new capacity=min capacity;if(new capacity-MAX _ ARRAY _ SIZE 0)new capacity=huge capacity(min capacity);//minCapacity通常接近size,所以这是一个win : element data=arrays . copy of(element data,new capacity);} private static int huge capacity(int min capacity){ if(min capacity 0)//溢出抛出new out of memory error();return(min capacity MAX _ ARRAY _ SIZE)?整数。MAX _ VALUE : MAX _ ARRAY _ SIZE} Max _ array _ size=integer . Max _ value-8在源代码中定义;上面的注释也很清楚。
一些虚拟机可能会在阵列中保留一些标头信息,分配更大的长度可能会导致OutOfMemoryError异常。
这样做的原因是为了尽可能地避免由于分配更大的长度而导致的OutOfMemoryError异常,因为vm使用数据存储头的信息。但是不一定要超过这个长度,会不正常。这只是为了尽量避免。但是,如果一个vm使用一个数组来存储一些头,并且这些头的长度大于8,那么当数组扩展到2 ^ 31-1并减去头的信息长度时,仍然会发生OutOfMemoryError异常。
Arraylist的MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
arrayList底层结构是基于数组实现的,作为下标的最大数据应该是整数。MAX_VALUE,即2 ^ 31-1。
当我们看上面代码中的grow(int minCapacity)时,会发现它有一个特别的地方。
if(new capacity-MAX _ ARRAY _ SIZE 0)new capacity=huge capacity(min capacity);而hugeCapacity(int minCapacity)方法表明,
private static int huge capacity(int min capacity){ if(min capacity 0)//溢出抛出new out of memory error();return(min capacity MAX _ ARRAY _ SIZE)?整数。MAX _ VALUE : MAX _ ARRAY _ SIZE}新长度可以是整数。满足特定条件时的MAX_VALUE。
所以Arraylist的最大长度是2147483647,也就是2 ^ 31-1。
Arraylist的最大长度为2147483647即2^31-1
00-1010太阳公司的源代码有以下两种构造方法。
ArrayList的扩容问题
无参数的构造方法是预先创建一个空数组,当第一个元素加入数组时,初始容量为10。
ArrayList的容量有两种
参数构造方法是传入一个容量值,然后定义容量。
接下来是关于容量满了之后的扩容问题
容量扩展的原因是因为容量已满,添加元素的方法是add(),所以容量扩展与add()方法有关。
从下面的add()方法中,我们可以看到add()调用了另一个add()方法。当我们点击它的时候,会发现展开也和grow()方法有关。
这是最后一个grow()扩展方法,我们可以找到其中的一个。
最小容量增长值是minCapacity-oldCapacity,然后oldCapacity是位操作,右移一位。
即增加的容量=原容量-原容量/2=0.5原容量。
所以扩容后的容量是扩容前的1.5倍。
另外,HashMap初始容量为16后HashSet底层为*2,初始容量为2的倍数扩展因子为0.75。
属性初始容量为11,扩展为* 2 ^ 1。膨胀系数为0.75。
以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。