ArrayList和LinkedList在中间开始插入的快慢比较
首先创建带数据的两个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在中间开始插入的快慢比较的更多相关文章
- Java集合(六)--ArrayList、LinkedList和Vector对比
在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...
- 基准测试了 ArrayList 和 LinkedList ,发现我们一直用 ArrayList 也是没什么问题的
ArrayList 应该是 Java 中最常用的集合类型了,以至于我们说到集合就会自然而然的想到 ArrayList.很多同学都没有用过除了 ArrayList 之外的其他集合,甚至于都已经忘了除了 ...
- ArrayList和LinkedList插入删除效率的测试(完全不在一个数量级8/20)
通过index获取元素的值 java里面的链表可以添加索引,而C中的链表,是没有索引的 package ArrayListVSLinkedList; import java.util.ArrayLis ...
- ArrayList 和linkedList 插入比较
从学Java开始, 就一直大脑记着 arrayList 底层是数组 ,查询快, 插入慢, 有移动的动作.linkedList 底层链表, 插入快 查询慢,今天写了例子跑了跑, 果然. public ...
- 深入理解java中的ArrayList和LinkedList
杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...
- Java数据结构之表的增删对比---ArrayList与LinkedList之一
一.Java_Collections表的实现 与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表. 1.ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于g ...
- C++模拟实现JDK中的ArrayList和LinkedList
Java实现ArrayList和LinkedList的方式采用的是数组和链表.以下是用C++代码的模拟: 声明Collection接口: #ifndef COLLECTION_H_ #define C ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析
最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...
随机推荐
- UVC 驱动调用过程与驱动框架的简单分析
内核:Linux-3.4.2 驱动:drivers\media\video\uvc\uvc_driver.c UVC 驱动整体调用流程: /* 打开设备描述符 */ 1. open: uvc_v4l2 ...
- centos7+cobbler+kickstart
一.cobbler简介 cobbler 是一个系统启动服务boot server,可以通过pxe得方式用来快速安装,重装系统,支持安装不同linux发行版和windows.这个工具是用python开发 ...
- Django 系列博客(三)
Django 系列博客(三) 前言 本篇博客介绍 django 的前后端交互及如何处理 get 请求和 post 请求. get 请求 get请求是单纯的请求一个页面资源,一般不建议进行账号信息的传输 ...
- ListView的setOnItemClickListener位置错乱问题
如果你对一个ListView同时addHeaderView(listhHeaderView),也就是头部视图,再加setAdapter,当你加上setOnItemClickListener事件后你会发 ...
- 第一册:lesson ninety-three。
原文: our new neighbor. Nigel is our new next-door neighbor. He is a pilot. He was in the R.A.F. He w ...
- 第一册:lesson eighty nine.
原文: For sale. A:Good afternoon. I believe that the house is for sale. B:That's right. A:May I have a ...
- Thread类(线程)
操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...
- [android] 采用post的方式提交数据
GET:内部实现是组拼Url的方式,http协议规定最大长度4kb,ie浏览器限制1kb POST和GET的区别比较了一下,多了几条信息 Content-Type:application/x-www- ...
- Docker 系列四(自定义仓库).
一.Docker hub 交互 Docker hub 是 Docker 官方维护的一个公共仓库,大部分需求都可以通过在 Docker hub 中直接下载镜像来完成.接下来,来看一下怎么与 Docker ...
- java集合框架-List集合ArrayList和LinkedList详解
List 集合源码剖析 ✅ ArrayList 底层是基于数组,(数组在内存中分配连续的内存空间)是对数组的升级,长度是动态的. 数组默认长度是10,当添加数据超越当前数组长度时,就会进行扩容,扩容长 ...