ArrayList和LinkedList使用小技巧

1 在List尾部插入数据时,数据量如果较小,两者的差别不大,linkedList速度比arrayList稍微快一点,这和自己定义的arrayList的初始容量有直接关联,当数据量较大时ArrayList比较快,因为ArrayList扩容是当前容量1.5倍,大容量扩一次就能提供很多空间,而LinkedList每次add时候会new Node,当数据量大时,new Node消耗的时间会让linkedList比arrayList慢很多。

2 在List首部插入数据时,LinkedList较快,因为LinkedList遍历插入位置花费时间很小,ArrayList需要将数组变更为新数组并进行重新排序,这个动作消耗的时间很长,相比而言,linkedList的速度会更快。

3 插入越往中间,LinkedList效率越低,因为它遍历获取插入位置是从两端往中间搜,index越往中间遍历越久,因此ArrayList的插入效率可能比LinkedList高。

4 插入位置越往后,ArrayList效率越高,因为数组需要复制后移的数据少了,那么System.arraycopy就快了。因此在首部插入数据LinkedList效率比ArrayList高,在尾部插入数据ArrayList效率比LinkedList高。

往尾部插入数据:

   public static void main(String[] args) {
        List<Integer> cargoNo = new ArrayList<>();
        List<Integer> cargoNos = new LinkedList<>();
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            cargoNo.add(i);
        }
        //cargoNo.get(3997979);
        long endTime = System.currentTimeMillis();
        System.out.println("arrayList所用时间为"+(endTime-startTime));


        for (int i = 0; i < 10000000; i++) {
            cargoNos.add(i);
        }
        //cargoNos.get(3997979);
        long endTime1 = System.currentTimeMillis();
        System.out.println("linkedList所用时间为"+(endTime1-endTime));

    }

千万级别数据的情况下也是arrayList速度要比linkedList要快:

 往首部插入数据:

public static void main(String[] args) {
        List<Integer> cargoNo = new ArrayList<>();
        List<Integer> cargoNos = new LinkedList<>();
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            cargoNo.add(0,i);
        }
        //cargoNo.get(3997979);
        long endTime = System.currentTimeMillis();
        System.out.println("arrayList所用时间为"+(endTime-startTime)+"ms");


        for (int i = 0; i < 1000000; i++) {
            cargoNos.add(0,i);
        }
        //cargoNos.get(3997979);
        long endTime1 = System.currentTimeMillis();
        System.out.println("linkedList所用时间为"+(endTime1-endTime)+"ms");

    }

往首都插入数据时,数据量大的情况下,ArrayList的非常慢的:

总结:

以下情况使用 ArrayList :

频繁访问列表中的某一个元素。
只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList :

你需要通过循环迭代来访问列表中的某些元素。
需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值