List接口之ArrayList扩容机制

1.生成ArrayList我们一般使用无参构造器 即为

List<Object> list= new ArrayList<>();
第二种则是指定大小
List<Object> list= new ArrayList<>(10);

第一种使用无参构造器创建集合扩容机制:

1.初始化容量为0

2.当第一次添加数据调用 add()方法时候进行判断(这时候扩容为10)

看源码:

for (int i=0;i<10;i++){
    list.add(i);
}

ArrayList 底层维护一个 elementData 数组 它是 transient 关键字修饰 这个关键字修饰 在编译时不会被序列化 会被忽略

 

modCount 为操作次数 可以看到是零 证明没有进行操作过,因为我们添加的是 inte 会自动帮我们装箱 为Interge

这里调用了 grow()  判断是否要进行扩容

private static final int DEFAULT_CAPACITY = 10;

初始为0 0+0>>1 等价 0+0/2 还是为0

第一次为空 elementData==DEFAULTCAPACITY_EMPTY_EMEMENTDATA //true 

renturn Math.max(10,1);  这里自然返回的是10 

再进入 grow()方法 这里 再执行下去 就生成了一个 长度为10的 elementData数组

进行添加第二个数  再进行判断 如下判断

进行 第十一个数的添加 操作 进行判断的

 return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity)

在前面 我们的的newCapacity = oldCapacity +(oldCapacity >>1) // old +old/2

返回的就是15 即从 10 -->15 进行了1.5倍的 扩容 此后依旧如此 ,每次进行插入都将会进行判断, 满足条件就会进行扩容.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值