java 中ArrayList与LinkedList性能比较

 更新时间:2017年03月07日 11:02:44   投稿:lqh  
这篇文章主要介绍了java 中ArrayList与LinkedList性能比较的相关资料,需要的朋友可以参考下

java 中ArrayList与LinkedList性能比较

今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 LinkedList,用到的情景是在一个循环里面进行顺序的插入操作。

众所周知java里面List接口有两个实现ArrayList 和 LinkedList,他们的实现原理分别是c语言中介绍的数组和链表。

正如学习数据结构时的认识,对于插入操作,链表的结构更高效,原因是可以通过修改节点的指针 就可以完成插入操作, 而不像数组,

需要把插入位置之后的数组元素依次后移。

但是,实际情况真如上面设想一样吗,下面通过一个简单的例子实践,看能得出什么结论。

public static void main(String[] args) {
    List<String> arrayList = new ArrayList<String>();
    List<String> linkedList = new LinkedList<String>();
    long time1 = System.currentTimeMillis();
    for(int i = 0; i < 1000000; i++) {
      arrayList.add(new String("abc"));
    }
    long time2 = System.currentTimeMillis();
    for(int i = 0; i < 1000000; i++) {
      linkedList.add(new String("abc"));
    }
    long time3 = System.currentTimeMillis();
    System.out.println("arrayList.insert_time = " + (time2 - time1));
    System.out.println("linkedList.insert_time = " + (time3 - time2));
    long time11 = System.currentTimeMillis();
    for(int i = 0; i < 10000; i++) {
      int random = RandomUtils.nextInt(10000);
      String temp = arrayList.get(random);
    }
    long time12 = System.currentTimeMillis();
    for(int i = 0; i < 10000; i++) {
      int random = RandomUtils.nextInt(10000);
      String temp = linkedList.get(random);
    }
    long time13 = System.currentTimeMillis();
    System.out.println("arrayList.read_time = " + (time12 - time11));
    System.out.println("linkedList.read_time = " + (time13 - time12));
  }

运行结果:

arrayList.insert_time = 188
linkedList.insert_time = 250
arrayList.read_time = 16
linkedList.read_time = 234

通过结果可以看出:无论什么情况,ArrayList更加高效。尤其对于随机读取,数组的效率是链表的14倍之多。

而插入操作,两者用时相差不多,但是还是数组的实现效率高一些。

对于其中原因,仔细想想也不难想明白。

当List存储的内容不多时,写入List的最后的元素,ArrayList和LinkedList用时差不多。

但是当List存储的元素个数很大时,通过数组结构实现的ArrayList插入到最后可以通过数组下标很快访问到,但是LinkedList就需要访问每个节点直到找到最后的元素再进行插入操作,这中操作步骤的耗时是巨大的,所以列表数量越大,LinkedList就越感吃力了。

当然,对于要求随机插入的场景,这个时候LinkedList就要比ArrayList适合了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C++ 超全面讲解多态

    C++ 超全面讲解多态

    这篇文章主要介绍了C++多态的原理与实现,多态是一种面向对象的设计思路,本身和C++不是强绑定的,其他语言当中一样有多态,只不过实现的方式可能有所不同。下面来一起了解更多详细内容吧
    2022-04-04
  • c++实现简单的线程池

    c++实现简单的线程池

    这里给大家介绍了C++中对于pthread线程的一个简单应用以及使用继承CDoit,实现其中的start和end,有需要的小伙伴可以参考下
    2015-11-11
  • C++编写非侵入式接口

    C++编写非侵入式接口

    这篇文章主要介绍了C++编写非侵入式接口的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++ Coroutine简单学习教程

    C++ Coroutine简单学习教程

    这篇文章主要为大家详细介绍了C++ Coroutine的简单学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Dev C++编译时运行报错source file not compile问题

    Dev C++编译时运行报错source file not compile问题

    这篇文章主要介绍了Dev C++编译时运行报错source file not compile问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • C++之文件输入/输出流类解读

    C++之文件输入/输出流类解读

    这篇文章主要介绍了C++之文件输入/输出流类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++任意线程通过hwnd实现将操作发送到UI线程执行

    C++任意线程通过hwnd实现将操作发送到UI线程执行

    做Windows界面开发时,经常需要在多线程环境中将操作抛到主线程执行,下面我们就来学习一下如何在不需要重新定义消息以及接收消息的情况下实现这一要求,感兴趣的可以了解下
    2024-03-03
  • C语言实现学生成绩管理系统项目

    C语言实现学生成绩管理系统项目

    这篇文章主要为大家详细介绍了C语言实现学生成绩管理系统项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C 语言中布尔值的用法实战案例

    C 语言中布尔值的用法实战案例

    这篇文章主要为大家介绍了C语言中布尔值的用法实战案例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • C++的array和&array有什么区别

    C++的array和&array有什么区别

    本文主要介绍了C++的array和&array有什么区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论