Java集合常常见问题

ArrayList

1.初始容量和扩容

1)初始容量:以无参数构造放啊创建ArrayList时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量,数组容量扩为10。
2)扩容机制:

  • 加入第一个元素,底层数组长度为0(此时列表是个空列表),调用了初始化容量方法ensureCapacityInternal(),所需容量变量minCapacity 为10,底层数组的长度小于初始化容量就扩容,否则不进行扩容。
  • 当add第2个元素时,minCapacity 为2,此时e lementData.length(容量)在添加第一个元素后扩容成 10 了。此时,minCapacity - elementData.length > 0 不成立,所以不会进入 (执行)grow(minCapacity) 方法。
  • 添加第3、4···到第10个元素时,依然不会执行grow方法,数组容量都为10。
  • 直到添加第11个元素,minCapacity(为11)比elementData.length(为10)要大。进入grow方法进行扩容。
    总结:
    add()函数流程:
    调用容量确认方法ensureCapacityInternal(size + 1);
    1. 在方法中,先判断底层数组是否为初始时的数组,若是就获取默认的容量和传入参数的较大值。minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    2. 之后,调用方法 ensureExplicitCapacity(minCapacity);确认底层数组加入数据的容量大小,即判断是否需要扩容。在方法中比较minCapacity和底层数组长度,若minCapacity大的话就要扩若,否则不需要。
      详细请看:https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/ArrayList-Grow.md
System.arraycopy() 和 Arrays.copyOf()方法

联系:看两者源代码可以发现 copyOf() 内部实际调用了 System.arraycopy() 方法
区别:

  • arraycopy() 需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置
  • copyOf() 是系统自动在内部新建一个数组,并返回该数组。
ensureCapacity方法

最好在 add 大量元素之前用 ensureCapacity 方法,以减少增量重新分配的次数。
即先将底层数组扩容到一定容量大小的数组,以防止出现,不断扩容的操作进行,这样也会使代码运行效率变低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值