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的五种循环遍历方式,各种方式的性 ...
随机推荐
- Docker的基本操作与示例
一.RunC RunC是一个由OCI(Open Container Initiative)制定的标准化轻量容器运行工具.OCI是专门致力于制定容器格式和运行时开放的工业化标准的组织.那容器标准化后Do ...
- FMDB源码解析
上一篇博客讲述SQLite的使用,本篇将讲述FMDB源码,后面也会讲解SQLite在使用与FMDB的区别.本篇读下来大约20-30分钟,建议大家先收藏一下. FMDB是以OC方式封装SQLite中C语 ...
- c# 大批量用户访问数据库报错
报错信息:There is already an open DataReader associated with this Connection which must be closed first ...
- c# 关于字段内存排序
关键字:StructLayout.LayoutKind.Explicit.FieldOffset [StructLayout(LayoutKind.Explicit)] public class AA ...
- ASP.NET MVC 学习笔记-7.自定义配置信息
ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, <appSettings> <add key="LogInf ...
- c# 破解谷歌翻译
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#中关闭子窗口而不释放子窗口对象的方法
1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象. Form2 f2 = new Form2(); 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 priv ...
- html 三列布局(两列自适应,一列固定宽度)
不做过多解释:主要是记录一个完整的布局样式,实现页面大致三列其中左右两列是自适应宽度,中间固定宽度效果. 不多少代码奉上: CSS样式代码: /******************** *公共标签样式 ...
- collect_list/collect_set(列转行)
Hive中collect相关的函数有collect_list和collect_set. 它们都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重. 做 ...
- How to Create a First Shell Script
How to Create a First Shell Script Shell scripts are short programs that are written in a shell pr ...