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

public class Hero {
public static void main(String[] args){
listAndLink();
}
public static void listAndLink(){
List<String> list = new ArrayList<String>();
LinkedList<String> link = new LinkedList<String>();
//生产数据
for(int i = 0; i < 100000; i ++){
list.add("dfghdffdhghdfghdfghians"+i);
link.add("dfghdffdhghdfghdfghians"+i);
}
//标记开始时间
long startlist = System.currentTimeMillis();
//在list中间插入数据
for(int i = 0; i < 10000; i ++){
list.add((5000+i), "asdfasdfaasdf");
}
//标记结束时间
long endlist = System.currentTimeMillis();
System.out.println("list time==="+(endlist - startlist)); //标记开始时间
long startLink = System.currentTimeMillis();
//在link中间插入数据
for(int i = 0; i < 10000; i ++){
link.add((5000+i), "asdfasdfaasdf");
}
//标记结束时间
long endLink = System.currentTimeMillis();
System.out.println("link time -----"+(endLink - startLink)); }
}

结果

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

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

public class Hero {
public static void main(String[] args){
listAndLink();
}
public static void listAndLink(){
List<String> list = new ArrayList<String>();
LinkedList<String> link = new LinkedList<String>();
//生产数据
for(int i = 0; i < 100000; i ++){
list.add("dfghdffdhghdfghdfghians"+i);
link.add("dfghdffdhghdfghdfghians"+i);
}
//标记开始时间
long startlist = System.currentTimeMillis();
//在list中间插入数据
for(int i = 0; i < 10000; i ++){
list.add((5+i), "asdfasdfaasdf");
}
//标记结束时间
long endlist = System.currentTimeMillis();
System.out.println("list time==="+(endlist - startlist)); //标记开始时间
long startLink = System.currentTimeMillis();
//在link中间插入数据
for(int i = 0; i < 10000; i ++){
link.add((5+i), "asdfasdfaasdf");
}
//标记结束时间
long endLink = System.currentTimeMillis();
System.out.println("link time -----"+(endLink - startLink)); }
}

结果

从这里看确实是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. iOS-CoreData详解与使用

    上面已经说完了SQLite和FMDB以及两者的区别,本篇将讲述iOS中另一个存储方式,CoreData的使用.通读下来大约10分钟,后续还会根据项目中问题,不断更新. 一.预备知识 在了解CoreDa ...

  2. [转]BTC手续费计算,如何设置手续费

    本文转自:https://blog.csdn.net/servletcome/article/details/81941334 首先BTC的交易手续费和交易金额是没有关系的.不要误认为交易的金额越大手 ...

  3. [转]图解Docker容器和镜像

    本文转自:https://www.cnblogs.com/wangqiaomei/p/5818636.html 图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器 ...

  4. nginx支持跨域访问

    1,进入nginx的html目录 vim ./crossdomain.xml 具体路径: /usr/local/nginx/html/crossdomain.xml 2,在crossdomain.xm ...

  5. [android] 隐式意图和显式意图的使用场景

    激活系统的某些应用,并且往应用里面填一些数据,比如说短信应用 打开短信应用,查看logcat,找到ActivityManager, 看到Display.com.android.mms/.ui.Comp ...

  6. struts2_HelloWorld

    第一个Struts2程序-Hello 1.创建web工程struts2-01-Hello 2.导入jar包到bin目录,jar地址: https://files.cnblogs.com/files/a ...

  7. python_字符串的操作

    一:字符串的方法与操作 *注意:首字母为l的为从左边操作,为r的方法为从右边操作 1.__contains__()判断是否包含 判断指定字符或字符串是否包含在一个字符串内,返回值为true或者fals ...

  8. [转] 快速部署Tomcat项目的Shell脚本

    为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启tomcat之前先检查tomcat进程有没有停掉,没有还要手动kill该进程. 发布次数多了,操作就比较繁琐 ...

  9. PHP全路径无限分类导航LINK代码实现

    <?php /** * @param php全路径无限分类 */ include('db.inc.php'); function getPathCate($cateid){ $sql = &qu ...

  10. 一个优秀的SEOer必须掌握的三大标配技术

    首先,认识网页代码是基础 这里所讲的网页代码是指HTML代码,并不是指复杂的PHP模板技术.一般的培训机构总是提倡学SEO不用学网页代码,只要会购买域名空间搭建网站就行,因为现在的网站模板太丰富了,对 ...