数据结构ArrayList和LinkedList区别

ArrayList和LinkedList区别:

1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;

2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;

3. 对于add和remove,一般大家会说LinkedList要比ArrayList快,因为ArrayList要移动数据。但实际情况并非如此,对于添加或删除,LinkedList和ArrayList并不能明确说明谁快谁慢,下面会详细分析。

 

ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,但是还是比ArrayList要慢。这点是毋庸置疑的。
ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素;LinkedList主耗时的是要先通过for循环找到index,然后直接插入或删除。这就导致了两者并非一定谁快谁慢,下面通过一个测试程序来测试一下两者插入的速度:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ArrayOrLinked {
    static List<Integer> linked = new LinkedList<Integer>();
    static List<Integer> array = new ArrayList<Integer>();

    public static void main(String[] args) {
        //首先分别给两者插入10000条数据
        for (int i = 0; i < 10000; i++) {
            array.add(i);
            linked.add(i);
        }
        //获得两者插入数据的时间
        System.out.println("array insert time:" + insertTime(array));
        System.out.println("linked insert time:" + insertTime(linked));

    }

    //插入数据
    public static long insertTime(List<Integer> list) {
        /*
         * 插入的数据量和插入的位置是决定两者性能的主要方面,
         * 我们可以通过修改这两个数据,来测试两者的性能
         */
        long num = 10000; //表示要插入的数据量
        int index = 5000; //表示从哪个位置插入
        long time = System.currentTimeMillis();
        for (int i = 1; i < num; i++) {
            list.add(index, i);
        }
        return System.currentTimeMillis() - time;

    }
}

 

主要有两个因素决定他们的效率,插入的数据量和插入的位置。我们改变这两个因素来看看它们的插入效率。

我们分别在index=1000的位置、index=5000的位置和index=9000的位置插入10000条数据的运行时间如下:

在index=1000处插入数据:

array insert time:31

linked insert time:31

在index=5000处插入数据:

array insert time:15

linked insert time:141

在index=9000处插入数据:

array insert time:16

linked insert time:140

 

总结:

当数据量较小时,两者效率差不多,没有显著区别;当数据量较大时,大约在容量的1/10处开始,LinkedList的效率就开始没有ArrayList效率高了,特别到一半以及后半的位置插入时,LinkedList效率明显要低于ArrayList,而且数据量越大,越明显。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值