ArrayList自动扩容解析
分类:Java作者:编程之家
转自:nofollow">http://blog.csdn.net/huangfan322/article/details/52685922
<div class="line number1 index0 alt2" style="color:rgb(51,51,51); font-family:Monaco,Menlo,Consolas,'Courier New',monospace; line-height:14.3px; font-size:13px; background-color:rgb(245,245,245); border:0px!important; bottom:auto!important; float:none!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px 1em!important">
<code class="java plain" style="font-family:Monaco,monospace; border:0px!important; bottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important; color:rgb(0,0)!important">探索ArrayList自动改变size真相
一个引用型数组里的,有人认为该数组有“
自动增长机制”可以
自动改变size大小。正式地说,该数组是无法改变
ottom:auto!important; float:none!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px 1em!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
方法生成ArrayList对象时,
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important"> 一个私有的未被序列化的数组elementData,用来存储ArrayList的对象列表(注意只定义未初始):
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-weight:700!important; margin:0px!important; padding:0px!important; color:rgb(255,120,0)!important">private
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
copyOf
方法覆盖原数组,是实现
自动改变ArrayList的大小(size)的关键。有人说ArrayList是复杂的数组,我
方法组合。
方法源码如下:
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important"> galArgumentException(
gal Capacity: "
一个空列表
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important; color:gray!important">@param
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important; color:gray!important">@throws
c) {
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important"> copyOf(elementData, size, Object[].
自动改变size机制
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
用户增加新的列表对象,java设置了最小容量(minCapacity)
用户来讲,它是无意义的。而size存储着列表
增加和
删除等三种情况下的size
自动改变机制进行分析。
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
方法源码中,我们不难看出Capacity初始值(initialCapacity)可以由
用户直接指定或由
用户指定的Collection集合存
默认为默认为
用户指定Collection创建ArrayList时,size值等于
ottom:auto!important; float:none!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px 1em!important">
方法
方法的源码如下:
方法中
调用的ensureCapacityInternal主要用来调整容量,
修改elementData数组的指向。其中涉及到
方法的调用,其核心在于grow方法:
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
IoUs code
>
MAX_ARRAY_SIZE) ?
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
代码,我们可知java
自动增加ArrayList大小的思路是:向ArrayList
添加对象时,原对象数目加
一个原数组的拷贝,并
修改原数组,指向这个新建数组。原数组
自动抛弃(java
垃圾回收机制会
自动回收)。size则在向数组
添加对象,自增
ottom:auto!important; float:none!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px 1em!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important"> 方法
方法其一源码如下(其它的就不累述了):
stem.array
copy(elementData, index+
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
=
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important"> indexoutofboundsexception(outOfBoundsMsg(index));
获取指定index所在位置的对象
ottom:auto!important; float:none!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px 1em!important">
方法相似,都是同数组拷贝。
用户也可以指定ArrayList实例的容量,可以有效的降低时间成本。它是通过
调用ensureCapacityInternal来实现的,源
代码
方法来访问它:
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; line-height:1.1em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px!important">
ottom:auto!important; float:none!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; margin:0px!important; padding:0px 1em!important">
用户向ArrayList追加对象时,Java总是要先计算容量(Capacity)是否适当,若容量不足则把原数组拷贝到以指定容量为长度创建的
在这同时,size进行自增
删除对象时,先使用拷贝方法把指定index后面的对象前移
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。