首页 > 编程知识 正文

arraylist扩容几倍,扩容卡可以正常使用吗

时间:2023-05-05 03:15:53 阅读:147070 作者:4084

ArrayList是基于动态数组实现的数据结构,添加元素时,如果元素的数量超过list的容量,则会导致扩展。

ArrayList扩展是如何进行的,按照代码进行扩展是最容易理解的。

/** *添加元素list尾部* * @param e预定添加元素* @return是附加成功标记*/publicbooleanadd(e ) /确保内部容量增加的EnsureCapacityinternal(size1);//增量模式计数! 元素数据[ size ]=e; 返回真; }/* * *允许list容纳一个内部容量增加的元素*上述方法将特定list的size 1设置为最小容量大小,size=list容量容量容量size 1作为容量绝对满足要求*/因为私有封装内部(内部封装封装)封装封装封装(calc封装) } /** *计算动态数组容量*给定动态数组容量私有数据计算能力(对象[ ] element data, 如果intmincapacity(/动态数组为空if (element data==default capacity _ empty _ element data ) /,则为默认容量10和最小容量之间的较大值,需要的容量和最小容量return minCapacity,因为最小容量已经等于size 1; } /** *计算明确的容量*针对给定的动态数组和最小容量值,计算list所需容量大小的*/privatevoidensureexplicitcapacity (int min capacity ) list结构发生更改的次数//如果容量最小值大于动态数组的长度,则扩展if (mincapacity-element data.length0) grow (扩展if ); }/* * *扩展列表的容量,使列表至少包含minCapacity个元素* @ parammincapacitythedesiredminimumcapacity */privatevoidgrow (int min capacity ) 新容量扩大到原容量的1.5倍,右一位移动涉及原数值除以2的值,加上原容量长度intnewcapacity=old capacity (old capacity1)。 //第一次存储元素时,minCapacity为10,上面计算的newCapacity为0if(newcapacity-mincapacity0)//此时,新容量为mincapacity newcapacity 新容量进行最大数组长度if(newcapacity-max_array_size0)//超大容量处理,结果为最大容量new capacity=huge capacity (mincapacity ) ); //将原始elementData数组元素复制到新newCapacity容量数组中的element data=arrays.copy of (element data,newCapacity ); } /** *超大容量处理(* /专用缓存容量(int min capacity ) if (mincapacity0)/overflowthrownewoutofmemoryeror ) ) re

turn (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }

通过上面的代码,可以总结如下:

ArrayList无参构造方法默认容量为10如果添加的元素超出当前list容量,list容量扩充一半ArrayList最大容量不超过Integer的最大值

 

代码测试

/** * ArrayList容量测试 * @throws Exception * @throws SecurityException */ public static void arrayListCapacity() throws Exception, SecurityException { // 默认容量测试 List<Object> list = new ArrayList<Object>(); Field size = list.getClass().getDeclaredField("size"); Field elementDataField = list.getClass().getDeclaredField("elementData"); size.setAccessible(true); elementDataField.setAccessible(true); Object[] elementData; for (int i=0; i<30; i++) { Object o = new Object(); list.add(o); if (i==9 || i==10 || i==11 || i==14 || i==15 || i==22 || i==23 ) { elementData = (Object[])elementDataField.get(list); System.out.println("i=" + i + ",size=" + size.get(list) + ",动态数组地址" + elementData + ",elementData=" + elementData.length); } } System.out.println("**********分割线***********"); // 指定容量测试 List<Object> list2 = new ArrayList<Object>(6); Field size2 = list2.getClass().getDeclaredField("size"); Field elementDataField2 = list2.getClass().getDeclaredField("elementData"); size2.setAccessible(true); elementDataField2.setAccessible(true); Object[] elementData2; for (int i=0; i<30; i++) { Object o = new Object(); list2.add(o); if (i==5 || i==6 || i==9 || i==13 || i==19 || i==28 || i==29 ) { elementData2 = (Object[])elementDataField2.get(list2); System.out.println("i=" + i + ",size=" + size2.get(list) + ",动态数组地址" + elementData2 + ",elementData=" + elementData2.length); } } }

运行结果

i=9,size=10,动态数组地址[Ljava.lang.Object;@6d06d69c,elementData=10i=10,size=11,动态数组地址[Ljava.lang.Object;@7852e922,elementData=15i=11,size=12,动态数组地址[Ljava.lang.Object;@7852e922,elementData=15i=14,size=15,动态数组地址[Ljava.lang.Object;@7852e922,elementData=15i=15,size=16,动态数组地址[Ljava.lang.Object;@4e25154f,elementData=22i=22,size=23,动态数组地址[Ljava.lang.Object;@70dea4e,elementData=33i=23,size=24,动态数组地址[Ljava.lang.Object;@70dea4e,elementData=33**********分割线***********i=5,size=30,动态数组地址[Ljava.lang.Object;@5c647e05,elementData=6i=6,size=30,动态数组地址[Ljava.lang.Object;@33909752,elementData=9i=9,size=30,动态数组地址[Ljava.lang.Object;@55f96302,elementData=13i=13,size=30,动态数组地址[Ljava.lang.Object;@3d4eac69,elementData=19i=19,size=30,动态数组地址[Ljava.lang.Object;@42a57993,elementData=28i=28,size=30,动态数组地址[Ljava.lang.Object;@75b84c92,elementData=42i=29,size=30,动态数组地址[Ljava.lang.Object;@75b84c92,elementData=42

通过测试,可以得出如下结论
1、ArrayList在存放元素超出现有数组大小时会自动扩容
2、每次扩容大小为当前容量的一半取(如无法整除则取整数位)
3、扩容后,会将当前数组中的所有元素拷贝到新的扩容数组中
4、默认容量和指定容量的ArrayList扩容规则相同

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。