2019独角兽企业重金招聘Python工程师标准>>>

两者末尾添加数据的性能如何?

我将通过程序和源码来解析。

程序解析

这里我将比较两者添加数据所消耗的时间。

    ArrayList<String> arr2 = new ArrayList<String>();LinkedList<String> link2 = new LinkedList<String>();long start =System.currentTimeMillis();for (int i = 0; i < asize; i++) {arr2.add("木子道_arrayList_"+i);}System.out.print("ArrayList exec add method " + asize + "|||");System.out.println(System.currentTimeMillis()- start +"/ms");start =System.currentTimeMillis();for (int i = 0; i < asize; i++) {link2.add("木子道_linkedList_"+i);}System.out.print("LinkedList exec add method " + asize + "|||");System.out.println( System.currentTimeMillis() - start + "/ms");

第一种结果:10万数据的插入ArrayList平均耗时170毫秒,LinkedList平均耗时70毫秒 ArrayList exec add method 100000,耗时 170/ms LinkedList exec add method 100000,耗时 74/ms

第二种结果:1万数据的插入ArrayList平均耗时90毫秒,LinkedList平均耗时50毫秒 ArrayList exec add method 10000,耗时 94/ms LinkedList exec add method 10000,耗时 51/ms

第三种结果:5千数据的插入ArrayList平均耗时50毫秒,LinkedList平均耗时40毫秒 ArrayList exec add method 5000,耗时 51/ms LinkedList exec add method 5000,耗时 41/ms

第四种结果:1千数据的插入ArrayList平均耗时10毫秒,LinkedList平均耗时10毫秒 ArrayList exec add method 1000,耗时 9/ms LinkedList exec add method 1000,耗时 12/ms

以上的结果不是固定的,消耗的时间也不能决定因素,只做参考。

源码解析 JDK1.7

 //*********ArrayList******
//添加数据
public boolean add(E e) {//数据增加,容量不够就扩容ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;
}
//
private void ensureCapacityInternal(int minCapacity) {modCount++;// overflow-conscious code 默认在10一下不需要扩容if (minCapacity - elementData.length > 0)grow(minCapacity);
}
//扩容
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//按1.5倍扩容int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win://扩容成功,容量当然也要改变啦。elementData = Arrays.copyOf(elementData, newCapacity);
}
//******LinkedList*******
//添加数据
public boolean add(E e) {linkLast(e);return true;
}
//链接e作为最后一个元素。
void linkLast(E e) {final Node<E> l = last;//至关重要。。。new一个节点对象final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;
}

通过源码发现ArrayList添加元素偶尔需要扩容。LinkedList每次都new一个对象,开销是固定。 通过程序发现ArrayList随着数据量大,性能远远比LinkedList差。

ArrayList使用数组存储,其实是一个内存连续块,插入元素涉及数组元素移动等内存操作。 LinkedList使用双向链表,将内存碎片通过引用关联起来,形成一个可以按序号索引的线性结构,这比数组连续方式相比,内存的利用率更高。插入数据只需记录本前后节点即可。

总结

ArrayList:随机访问快,插入和删除慢,基于数组的数据结构。

LinkedList:随机访问慢,插入和删除快,基于双向链表的数据结构。

ArrayList就是根据索引查。插入数组会复制成新数组,删除会移动数组,重排序。

LinkedList只能从头开始找,访问会慢,插入和删除不需要重排序所以快。

ArrayList扩容的时候会出现的结尾预留一定的容量空间的浪费。

LinkedList的每一个元素容量空间是相等。

我的结论是:末尾添加数据量小的时候。ArrayList性能好,而数据量大则是LinkedList性能好。 欢迎指正。。。

▼长按以下二维码即可关注▼

2018年请与我一起打怪升级

转载于:https://my.oschina.net/u/3758413/blog/1637919

ArrayList和LinkedList的add(E)性能秘密相关推荐

  1. 【java学习】Arraylist和LinkedList使用场景与性能对比

    介绍 ArrayList LinkedList 使用场景对比 两个实例: 二分查找 插入元素 总结 介绍 List 的三个子类的特点: ArrayList 底层结构是数组,底层查询快,增删慢. Lin ...

  2. ArrayList和LinkedList使用不当,性能差距会如此之大!

    前言 在面试的时候,经常会被问到几个问题: ArrayList和LinkedList的区别,相信大部分朋友都能回答上: ArrayList是基于数组实现,LinkedList是基于链表实现 当随机访问 ...

  3. ArrayList和LinkedList的插入删除性能差距到底有多大

    2019独角兽企业重金招聘Python工程师标准>>> 从算法角度来看,ArrayList是便于做查询的容器,LinkedList适合插入删除.如果在一个LinkedList做查询的 ...

  4. Java ArrayList、LinkedList和Vector的使用及性能分析

    第1部分 List概括 List 是一个接口,它继承于Collection的接口.它代表着有序的队列. AbstractList 是一个抽象类,它继承于AbstractCollection.Abstr ...

  5. java c 性能比较_java 中ArrayList与LinkedList性能比较

    java 中ArrayList与LinkedList性能比较 今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 LinkedList,用到的情景是在一个循环里面进行顺序的插入操 ...

  6. java的list和数组谁高效_java 中ArrayList与LinkedList性能比较

    java 中ArrayList与LinkedList性能比较 今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 LinkedList,用到的情景是在一个循环里面进行顺序的插入操 ...

  7. 移除集合效率高还是add高_HashMap存取效率高原因、ArrayList和LinkedList区别、JAVA实现链表的基本功能...

    一.HashMap存取效率高原因 1.Hash 也叫散列.哈希. 主要用于信息安全领域中的算法,把长度不同的信息转化为杂乱的128位的编码,找到一种数据内容与地址之间的映射关系. 注意:不同的输入可能 ...

  8. ArrayList与LinkedList的性能分析

    作者:小码哥Damon 链接:https://juejin.cn/post/6968633784874827784 来源:掘金 1. 前言 经常在面试时,被问到集合的概念,集合 List.Map.Se ...

  9. 比较ArrayList、LinkedList、Vector

    翻译人员: 铁锚 翻译时间: 2013年12月2日 原文链接: ArrayList vs. LinkedList vs. Vector 1. List概述 List,就如图名字所示一样,是元素的有序列 ...

最新文章

  1. R删除数据列基于dplyr包
  2. Vue+axios配置踩坑记录
  3. IDEA中Git操作
  4. Windows消息机制详解-6
  5. PowerPC VxWorks BSP分析(1)--PowerPC体系结构
  6. Spring入门与常用配置
  7. 下载CIFAR-10、CIFAR-100数据集的方法
  8. Davinci Configurator之User Config File配置功能
  9. ubuntu 安装有道词典
  10. RS232串口的直连串口线和交叉串口线的区别
  11. Revealing ecosystem services relationships and their driving factors for five basins of Beijing (2)
  12. <C++>初识STL —— 标准模板库
  13. Java Web 后续(三)
  14. recyclerView的滑动
  15. 微信的订阅号和服务号如何区分?
  16. CENTOS 7 安装 ORACLE 19C
  17. Linux——shell脚本
  18. JAVA潜心修炼五天——第4天
  19. 2019 CVPR之ReID:Hi-CMD: Hierarchical Cross-Modality Disentanglement for Visible-Infrared Person Re-Id
  20. Adobe Premiere Pro CS6的视频剪辑简单教程

热门文章

  1. JPA使用原生SQL查询
  2. angular代码分析之异常日志设计
  3. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序...
  4. 转-Android中自动连接到指定SSID的Wi-Fi
  5. Exchange OWA管理-----HTTPS实现OWA表单
  6. 自定义Flex Library的使用
  7. 基于Python语言Hamcrest断言的使用
  8. c语言一输入运算就显示错误,大咖都会犯的18个c语言入门错误
  9. Metasploit resource命令技巧
  10. 计算机辅助教育的可行性和存在的问题,论计算机辅助教学存在的问题及解决思路..docx...