ArrayList自动扩容解析
2017-10-27 15:05
316 查看
有的话),然后把空出来的位置置
null
,交给Junk收集器销毁,size自减
1
,即完成了都知道ArrayList是基于数组的,那它是怎么实现可变的呢?创建ArrayList对象时,ArrayList有个带参数的构造函数,那个参数的意思就代表着ArrayList长度,默认情况是10。当数据多了,ArrayList容不下时,这时ArrayList会增加长度,newLength = oldLength + oldLength/2;如果初始值是10,那么依次是15,22,33,49,73......,长度是增加了,那是怎样实现的呢?当数据容不下时,ArrayList会再创建一个更大的数组,数组长度为之前所说的那样,然后将之前的数据拷贝到新数组中。这就是ArrayList基于数组实现的可变长度原理。下面详细解释下:1、代码如下ArrayList初始化时没有设置容量大小,随后给他添加10个字符串,size变为10;当10个字符串添加完之后,继续添加,这时ArrayList容量增加到15,size变为11。如果当ArrayList容量又满了时,这时ArrayList容量增加到22,以此类推(10,15,22,33,49......),newCapacity = oldCapacity+(oldCapacity/2),截图如下:2、如果ArrayList初始化时不给其设置容量大小,当调用add方法时,会给其默认分配10容量值。3、ArrayList中add方法[java] view
plain copy/*** Appends the specified element to the end of this list.** @param e element to be appended to this list* @return <tt>true</tt> (as specified by {@link Collection#add})*/public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;}添加操作,首先会调用ensureCapacityInternal(size
+ 1),其作用为保证数组的容量始终够用,其中size是elementData数组中元组的个数,初始为0。ArrayList中ensureCapacityInternal方法[java] view
plain copyprivate void ensureCapacityInternal(int minCapacity) {if (elementData == EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensure
ExplicitCapacity()。ArrayList中grow方法[java] view
plain copy/*** Increases the capacity to ensure that it can hold at least the* number of elements specified by the minimum capacity argument.** @param minCapacity the desired minimum capacity*/private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}
函数体中,modCount是数组发生size更改的次数。然后if判断,如果数组长度小于默认的容量10,则调用扩大数组大小的方法grow()。[/code][java] view
plain copy>>表示带符号右移,如:int i=15; i>>2的结果是3,移出的部分将被抛弃。转为二进制的形式可能更好理解,0000 1111(15)右移2位的结果是0000 0011(3),0001 1010(18)右移3位的结果是0000 0011(3)。10>>1 为5
15>>1 为722>>1 为114、从内部实现机制来讲ArrayList是使用数组(Array)来控制集合中的对象。当你增加元素的时候,如果元素的数目超出了内部数组目前的长度,它需要扩展内部数组的长度,ArrayList是原来的50%,即newCapacity
= oldCapacity+(oldCapacity/2)
相关文章推荐
- ArrayList自动扩容解析
- ArrayList源码解析(二)自动扩容机制与add操作
- ArrayList自动扩容解析
- Java ArrayList自动扩容
- 【Java-集合】ArrayList的自动扩容
- ArrayList集合底层源代码展示以及结构解析,扩容机制
- 对Java ArrayList的自动扩容机制示例讲解
- 我知道我们的ArrayList会自动扩容,但是如果数据减少的时候会不会自动缩小容积呢?
- ArrayList的自动扩充机制实例解析
- Java ArrayList的自动扩容机制
- Java ArrayList的自动扩容机制
- ArrayList动态扩容机制--源码解析
- 关于ArrayList自动扩容
- 解决Gson解析数据用map接收时int自动转化为double问题
- 【JDK】:CopyOnWriteArrayList、CopyOnWriteArraySet 源码解析
- iphone 浏览器自动解析数字为号码解决办法
- Java集合框架源码解析-ArrayList
- Expected a string but was BEGIN_OBJECT at line 1 column 2 path $(不让retrofit2自动替我解析json)
- 深入解析Laravel5.5中的包自动发现Package Auto Discovery
- 安卓apk自动更新提示解析包失败