List性能提升小技巧

今天在看spring的源码的时候,看到这么一行代码

List<String> beanDefinitionNames = new ArrayList<String>(64);

看来下这个list的定义:

java.util.ArrayList.ArrayList<String>(int initialCapacity)

最后才恍然大悟,原来我们的List是基于数组的一个集合,在每次修改List的长度的时候,其实底层都会重新生成一个新的数组

Arrays.copyOf(elementData, newCapacity);

我们的List在new的时候,会给一个默认的长度为10的数组,ex:

        List list = new ArrayList<String>();
        list.add("1");
        list[1, null, null, null, null, null, null, null, null, null]

所以当我给list增加11个元素后,再来看下结果

        List list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        ...
        list.add("11");
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, null, null, null, null]

然后我们在来看下jdk1.8的源码,当调用list的add方法时,最后在计算数组长度的时候,会调用这么一段方法:

    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);
    }

所以,看到grow方法的第二行,有一个位移算法,是用原来的长度加上长度的一半得到新的list的长度。
到此应该全部清楚了,如果我们不停的重新对list做长度增加时,其实还是有一定的占用资源的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值