ArrayList和LinkedList的区别

先看一段代码:

public static void main(String[] args) {
    List arrayList = new ArrayList();

    //获取当前时间毫秒数
    long currentTime = System.currentTimeMillis();
    for (int i = 0; i < 300000; i++) {//给ArrayList添加30w个元素,添加到第一个位置
        arrayList.add(0, new Object());
    }

    //输出ArrayList添加30w个元素耗时
    System.out.println("arrayList添加300000个元素耗时:" + (System.currentTimeMillis() - currentTime));

    List linkedList = new LinkedList();
    currentTime = System.currentTimeMillis();//重新获取当前时间
    for (int i = 0; i < 300000; i++) {//给LinkedList添加30w个元素,添加到第一个位置
        linkedList.add(0, new Object());
    }
    //输出ArrayList添加30w个元素耗时
    System.out.println("linkedList添加300000个元素耗时:" + (System.currentTimeMillis() - currentTime));

    Random rand = new Random();
    currentTime = System.currentTimeMillis();
    for (int i = 0; i < arrayList.size(); i++) {
        arrayList.get(rand.nextInt(300000));//随机获取一个位置的元素
    }
    //输出ArrayList获取30w次元素耗时
    System.out.println("arrayList取出300000次元素耗时:" + (System.currentTimeMillis() - currentTime));

    currentTime = System.currentTimeMillis();
    for (int i = 0; i < linkedList.size(); i++) {
        linkedList.get(rand.nextInt(300000));//随机获取一个位置的元素
    }
    //输出LinkedList获取30w次元素耗时
    System.out.println("linkedList取出300000次元素耗时:" + (System.currentTimeMillis() - currentTime));
}

运行结果:

arrayList添加300000个元素耗时:8126
linkedList添加300000个元素耗时:16
arrayList取出300000个元素耗时:16
linkedList取出300000个元素耗时:193169

可以看到,ArrayList添加元素比Linked添加元素慢,但在取出元素时,ArrayList消耗的时间远远低于LinkedList。

因为ArrayList是由动态数组实现的,在一个位置插入数据,如果这个位置不是位于最后,这个位置及其后面的元素都要往后面进行移动,如图 1-1。
在这里插入图片描述

图 1-1
而LinkedList是链表实现,在添加元素到指定位置时,只需将元素进行连接即可,如图1-2。

在这里插入图片描述

图 1-2

在取出元素时,ArrayList只需根据下标获取指定位置的元素即可,但LinkedList由于是使用链表实现的,不可以直接通过下标进行获取指定元素。下面是LinkedList的get实现代码:

public E get(int index) {
    checkElementIndex(index);
    return node(index).item;
}
Node<E> node(int index) {
    // assert isElementIndex(index);

    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
            return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}

这段代码的意思是,如果下标小于LinkedList的元素数量的一半,则从第一个元素开始往后遍历寻找,否则从最后一个元素开始往前遍历寻找,直到找到指定位置的元素。也就是说LinkedList获取元素需要一个个遍历判断,并且元素个数越多,寻找元素需要的时间越长。

总结: ArrayList与LinkedList各有优缺点,ArrayList添加删除元素比较慢,但是取出元素比LinkedList快,而LinkedList添加删除元素比较快,但如果是经常要取出元素并且数据量比较大就可以尝试使用ArrayList。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值