ArrayList 是怎么实现可变长度的,Capacity容量
来源:互联网 发布:阿里云邮箱pc客户端 编辑:程序博客网 时间:2024/05/16 12:16
都知道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方法
/** * 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方法
private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensure
Explicit
Capacity()。
ArrayList中grow方法
/** * 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 code int 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()。
>>表示带符号右移,如: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 为7
22>>1 为11
4、从内部实现机制来讲ArrayList是使用数组(Array)来控制集合中的对象。当你增加元素的时候,如果元素的数目超出了内部数组目前的长度,它需要扩展内部数组的长度,ArrayList是原来的50%,即newCapacity = oldCapacity+(oldCapacity/2)
- ArrayList 是怎么实现可变长度的,Capacity容量
- ArrayList: 长度可变的数组
- StringBuilder 的容量(StringBuilder Capacity)
- 可变容量队列的数组实现
- 可变长度参数的实现
- 容量(capacity)
- ArrayList是怎么扩容的
- android 获取ArrayList的Capacity
- ArrayList初始默认容量(长度)
- Java中长度可变参数的实现 其实质是数组
- 减少ArrayList的容量
- 可变长度数据的管道实现方法
- 实现可变长度字符串的类
- 实现2边固定长度,中间可变长度的办法
- 怎么样提高ArrayList的效率(有关capacity)
- 简单自定义可变长度数组ArrayList
- ArrayList的初始容量和容量分配
- javascript数组的长度length是可变的
- 记录:js删除数组中某一项或几项的几种方法
- 《跟着茂爷学编程》
- struts的action 中向jsp中传递参数
- VIM基本设置
- 有钱与值钱是两个概念
- ArrayList 是怎么实现可变长度的,Capacity容量
- 等待
- 7. gii
- 04-树5 Root of AVL Tree (25分)
- 如何在C中实现面向对象
- Java异常
- 记录那些年书写过的心情
- 【java进阶】随机图片验证码
- Docker学习笔记4: Docker-Compose—简化复杂容器应用的利器