首先创建带数据的两个List, 然后在中间插入数据, 观察完成时间

  1. public class Hero {
  2. public static void main(String[] args){
  3. listAndLink();
  4. }
  5. public static void listAndLink(){
  6. List<String> list = new ArrayList<String>();
  7. LinkedList<String> link = new LinkedList<String>();
  8. //生产数据
  9. for(int i = 0; i < 100000; i ++){
  10. list.add("dfghdffdhghdfghdfghians"+i);
  11. link.add("dfghdffdhghdfghdfghians"+i);
  12. }
  13. //标记开始时间
  14. long startlist = System.currentTimeMillis();
  15. //在list中间插入数据
  16. for(int i = 0; i < 10000; i ++){
  17. list.add((5000+i), "asdfasdfaasdf");
  18. }
  19. //标记结束时间
  20. long endlist = System.currentTimeMillis();
  21. System.out.println("list time==="+(endlist - startlist));
  22.  
  23. //标记开始时间
  24. long startLink = System.currentTimeMillis();
  25. //在link中间插入数据
  26. for(int i = 0; i < 10000; i ++){
  27. link.add((5000+i), "asdfasdfaasdf");
  28. }
  29. //标记结束时间
  30. long endLink = System.currentTimeMillis();
  31. System.out.println("link time -----"+(endLink - startLink));
  32.  
  33. }
  34. }

结果

怎么会这样, 不应该是LinkedList更快吗? ArrayList底层是数组, 添加数据需要移动后面的数据, 而LinkedList使用的是链表, 直接移动指针就行, 按理说应该是LinkedList更快.

原因先不说, 接着改变插入位置, 再来试试

  1. public class Hero {
  2. public static void main(String[] args){
  3. listAndLink();
  4. }
  5. public static void listAndLink(){
  6. List<String> list = new ArrayList<String>();
  7. LinkedList<String> link = new LinkedList<String>();
  8. //生产数据
  9. for(int i = 0; i < 100000; i ++){
  10. list.add("dfghdffdhghdfghdfghians"+i);
  11. link.add("dfghdffdhghdfghdfghians"+i);
  12. }
  13. //标记开始时间
  14. long startlist = System.currentTimeMillis();
  15. //在list中间插入数据
  16. for(int i = 0; i < 10000; i ++){
  17. list.add((5+i), "asdfasdfaasdf");
  18. }
  19. //标记结束时间
  20. long endlist = System.currentTimeMillis();
  21. System.out.println("list time==="+(endlist - startlist));
  22.  
  23. //标记开始时间
  24. long startLink = System.currentTimeMillis();
  25. //在link中间插入数据
  26. for(int i = 0; i < 10000; i ++){
  27. link.add((5+i), "asdfasdfaasdf");
  28. }
  29. //标记结束时间
  30. long endLink = System.currentTimeMillis();
  31. System.out.println("link time -----"+(endLink - startLink));
  32.  
  33. }
  34. }

结果

从这里看确实是LinkedList比较快, 然后我又将插入位置改成9999, 结果如下

LinkedList的时间更长了, 现在大概知道了,插入位置的选取对LinkedList有很大的影响,

因为LinkedList在插入时需要向移动指针到指定节点, 才能开始插入,,一旦要插入的位置比较远,LinkedList就需要一步一步的移动指针, 直到移动到插入位置,这就解释了, 为什么节点值越大, 时间越长, 因为指针移动需要时间。

而ArrayList是数据结构, 可以根据下标直接获得位置, 这就省去了查找特定节点的时间,所以对ArrayList的影响不是特别大。

总结: 虽然会出现上面的情况, 可是因为ArrayList可以使用下标直接获取数据,所以在使用查询的时候一般选择ArrayList,而进行删除和增加时,LinkedList比较方便,所以一般还是使用LinkedList比较多。

ArrayList和LinkedList在中间开始插入的快慢比较的更多相关文章

  1. Java集合(六)--ArrayList、LinkedList和Vector对比

    在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...

  2. 基准测试了 ArrayList 和 LinkedList ,发现我们一直用 ArrayList 也是没什么问题的

    ArrayList 应该是 Java 中最常用的集合类型了,以至于我们说到集合就会自然而然的想到 ArrayList.很多同学都没有用过除了 ArrayList 之外的其他集合,甚至于都已经忘了除了 ...

  3. ArrayList和LinkedList插入删除效率的测试(完全不在一个数量级8/20)

    通过index获取元素的值 java里面的链表可以添加索引,而C中的链表,是没有索引的 package ArrayListVSLinkedList; import java.util.ArrayLis ...

  4. ArrayList 和linkedList 插入比较

    从学Java开始, 就一直大脑记着  arrayList 底层是数组 ,查询快, 插入慢, 有移动的动作.linkedList 底层链表, 插入快 查询慢,今天写了例子跑了跑, 果然. public ...

  5. 深入理解java中的ArrayList和LinkedList

    杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...

  6. Java数据结构之表的增删对比---ArrayList与LinkedList之一

    一.Java_Collections表的实现 与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表. 1.ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于g ...

  7. C++模拟实现JDK中的ArrayList和LinkedList

    Java实现ArrayList和LinkedList的方式采用的是数组和链表.以下是用C++代码的模拟: 声明Collection接口: #ifndef COLLECTION_H_ #define C ...

  8. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  9. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

随机推荐

  1. vue_drf之多级过滤、排序、分页

    一.前端代码 1,父组件free_course.vue <template> <div id="free_course"> <el-container ...

  2. MySQL系列详解七:MySQL双主架构演示-技术流ken

    前言 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mys ...

  3. 前端(二)之 CSS

    前端之 CSS 前言 昨天学习了标记式语言,也就是无逻辑语言.了解了网页的骨架是什么构成的,了解了常用标签,两个指令以及转义字符:其中标签可以分为两大类: 一类是根据标签内容可以分类单双标签,单标签指 ...

  4. SpringCloud学习(一):微服务简介

    一.前情概要 1.单体架构是什么 1).一个归档包包含了应用所有功能的应用程序, 我们通常称之为单体应用. 2).架构单体应用的架构风格, 我们称之为单体架构, 这是一种比较传统的架构风格. 2.单体 ...

  5. C# 隐式转换关键字 implicit

    implicit 关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 引用摘自:implicit(C# 参考 ...

  6. zend studio快捷键

    某些快捷键会失效,多尝试就好.快捷键就是一种减轻工作量的方式,或者说展示码农码代码的熟练度,重要的还在于对一个问题的看法和角度,说的具体些就是算法和数据结构,不看会后悔,不学设计模式也会吃亏. 应用场 ...

  7. JSJ—案例谈面向对象

    有人告诉我那里遍地都是对象——我们把所有的程序代码放在main()里面,事实上,那根本就不是面向对象的做法,在Java的面向对象中,我们也会看到类和对象的不同,以及对象是如何让你的生活更美好(至少程序 ...

  8. CSS层叠样式表(Cascading Style sheets)

    CSS层叠样式表(Cascading Style sheets) --------- ---------------- ----------- --------------- ----------- ...

  9. Laravel 系列入门教程(一)【最适合中国人的 Laravel 教程】

    热烈庆祝 Laravel 5.5 LTS 发布! 实际上 Laravel 上一个 LTS 选择 5.1 是非常不明智的,因为 5.2 增加了许许多多优秀的特性.现在好了,大家都用最新的长期支持版本 5 ...

  10. LeetCode | HouseCode 算法题

    题目: You are a professional robber planning to rob houses along a street. Each house has a certain am ...