java arraylist大小,java arraylist最大值

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: