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语言 文件读写 feof 函数

    关于C语言 文件读写 feof 函数

    这篇文章主要给大家分享的是关于C语言文件读写 feof 函数 ,feof 是 C 语言标准库函数,其功能是检测文件结束符,如果文件结束,则返回非 0 值,否则返回 0,感兴趣的小伙伴请跟小编一起来看看下面文章的内容吧
    2021-10-10
  • C语言数字图像处理之图像缩放

    C语言数字图像处理之图像缩放

    这篇文章主要为大家详细介绍了C语言数字图像处理之图像缩放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++基础入门教程(五):new和delete

    C++基础入门教程(五):new和delete

    这篇文章主要介绍了C++基础入门教程(五):new和delete,本文讲解了动态分配内存、new和delete的配对、new、delete与reatin、release的关系、动态数组等内容,需要的朋友可以参考下
    2014-11-11
  • C/C++中接收return返回来的数组元素方法示例

    C/C++中接收return返回来的数组元素方法示例

    return是C++预定义的语句,它提供了种植函数执行的一种放大,最近学习中遇到了相关return的内容,觉着有必要总结一下,这篇文章主要给大家介绍了关于C/C++中如何接收return返回来的数组元素的相关资料,需要的朋友可以参考下。
    2017-12-12
  • 纯C语言:折半查找源码分享

    纯C语言:折半查找源码分享

    这篇文章主要介绍了纯C语言:折半查找源码,有需要的朋友可以参考一下
    2014-01-01
  • C语言回溯法 实现组合数 从N个数中选择M个数

    C语言回溯法 实现组合数 从N个数中选择M个数

    在平时的算法的题目中,时常会遇到组合数相关的问题,暴力枚举。在N个数中挑选M个数出来。利用for循环也可以处理,但是可拓展性不强,于是写这个模板供以后参考
    2018-08-08
  • C++简单QQ程序服务器端的实现代码

    C++简单QQ程序服务器端的实现代码

    这篇文章主要为大家详细介绍了C++简单QQ程序服务器端的实现代码,感兴趣的朋友可以参考一下
    2016-05-05
  • 采用C++实现区间图着色问题(贪心算法)实例详解

    采用C++实现区间图着色问题(贪心算法)实例详解

    这篇文章主要介绍了采用C++实现区间图着色问题(贪心算法),很经典的算法问题,需要的朋友可以参考下
    2014-07-07
  • C++11获取线程返回值的实现代码

    C++11获取线程返回值的实现代码

    这篇文章主要介绍了C++11获取线程返回值的实现代码,需要的朋友可以参考下
    2019-04-04
  • c++ 构造函数中调用虚函数的实现方法

    c++ 构造函数中调用虚函数的实现方法

    下面小编就为大家带来一篇c++ 构造函数中调用虚函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论