ArrayList和LinkedList区别及性能测试
ArrayList和LinkedList是Java Lis接口的2个实现。它们的区别如下表所示:
|
底层结构 |
强项 |
弱项 |
|
|
ArrayList |
数组 |
随机访问get和set |
插入删除 |
|
LinkedList |
链表 |
插入删除 |
随机访问get和set |
那么它们在不同场景中的性能究竟有多大差别,我们来实测一下。
测试环境:联想G50-70/INTEL CORE I7-4510U 双核4线程/WIN8.1 64bit。
测试程序:ListPerformanceTest.java
package Colloections; import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List; public class ListPerformanceTest { public static void main(String[] args) {
// TODO Auto-generated method stub
ListPerformanceTest listPerformanceTest = new ListPerformanceTest();
listPerformanceTest.LinkedListPerformanceTest(50000);
listPerformanceTest.arrayListPerformanceTest(50000);
} public void listPerformanceTest(List<Integer> list){
int size = list.size();
long startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
list.get(i);
}
System.out.printf("%s: get element cost %d ms.%n", list.getClass().toString(), System.currentTimeMillis() - startTime);
startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
list.add(size, i);//add a element at designated position
}
System.out.printf("%s: add element cost %d ms.%n",list.getClass().toString(), System.currentTimeMillis() - startTime);
} public void LinkedListPerformanceTest(int size){
List<Integer> linkedList = new LinkedList<Integer>(createIntegerList(size));
listPerformanceTest(linkedList);
} public void arrayListPerformanceTest(int size){
List<Integer> arrayList = new ArrayList<Integer>(createIntegerList(size));
listPerformanceTest(arrayList);
} public List<Integer> createIntegerList(int size){
//construct a Integer list, but it is not a arrayList,is not allowed to add(),remove,etc
Integer [] array = new Integer[size];
for (int i = 0; i < size; i++) {
array[i] = i;
}
return Arrays.asList(array);
}
}
输出如下:
class java.util.LinkedList: get element cost 936 ms.
class java.util.LinkedList: add element cost 2244 ms.
class java.util.ArrayList: get element cost 1 ms.
class java.util.ArrayList: add element cost 186 ms.
咦,不是说LinkedList对于插入删除操作很快么,为什么测出来还要比arrayList慢那么多?
仔细看listPerformanceTest函数,我们将其中的add方法调用进行如下修改:
for (int i = 0; i < size; i++) {
list.add(0, i);//add a element at designated position
}
输出如下:
class java.util.LinkedList: get element cost 940 ms.
class java.util.LinkedList: add element cost 5 ms.
class java.util.ArrayList: get element cost 1 ms.
class java.util.ArrayList: add element cost 641 ms.
这个结果与表1就吻合了。测试结果表明,LinkedList进行add操作时,其性能与元素所在的位置有很大关系。由于链表无法进行随机访问,因此操作指定位置的元素时,都必须从首元素开始遍历,也就是说,如果指定元素的位置越靠后,则操作越耗时,越靠前则越省时。当然,remove操作也是一样的。因此,ArrayList与LinkedList的性能孰优孰劣不能一概而论,要视具体元素的分布而定。Java Tutorial原文写道:如果你决定使用LinkedList,在做决定之前请使用ArrayList和LinkedList分别测试你的应用程序,一般ArrayList要更快一些。
ArrayList和LinkedList区别及性能测试的更多相关文章
- String[]和ArrayList和LinkedList区别
String[]和ArrayList和LinkedList区别 参考文档如下: http://www.blogjava.net/flysky19/articles/92775.html http:// ...
- 一、基础篇--1.2Java集合-Arraylist 与 LinkedList 区别
Arraylist 与 LinkedList 区别 结构上的区别 ArrayList底层实现基于动态数组,LinkedList底层实现基于双向链表. 性能上区别 ArrayList查询快,增删慢 ...
- 1.ArrayList和LinkedList区别
说⼀下ArrayList和LinkedList区别 具体区别 1.1. ⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的 1.2. 由于底 ...
- Java中ArrayList和LinkedList区别
ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLis ...
- 简谈ArrayList和LinkedList区别
对于ArrayList和LinkedList,他们都实现了List接口,他们的区别大致为: ArrayList LinkedList (1)底层是数组,可以以O(1)的时间复杂度对元素进行随机访问 以 ...
- ArrayList和LinkedList区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Java中ArrayList和LinkedList区别、ArrayList和Vector的区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...
- ArrayList和LinkedList区别(蚂蚁金服面试题)
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 2. 底层数据结构: Arraylist 底层使用的是Object数组:LinkedLis ...
随机推荐
- 使用jdbc调用存储,函数
public class JdbcTest { private Connection conn = null; private PreparedStatement pst = nu ...
- QtWebKit/QtWebEngine移植差异(网摘)
QtWebKit/QtWebEngine移植差异 原文出处:[wiki.qt.io] This guide gives an overview of the differences between t ...
- VC++动态链接库(DLL)编程深入浅出
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
- C++中的继承(3)作用域与重定义,赋值兼容规则
作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A& ...
- 淘宝IP地址库采集
作者:阿宝 更新:2016-08-31 来源:彩色世界(https://blog.hz601.org/2016/08/31/taobao-ip-sniffer/index.html) 简述 当初选择做 ...
- [翻译] C# 8.0 预览
原文: C# 8.0 Previewed 在一个Channel 9 的视频中,Mads Torgersen展示了C#8的首批四个新特性. 可空引用类型 过去我们报道过可空引用类型,简单地说,默认情况下 ...
- python 项目中的 requirements.txt
背景 java项目的话,包依赖一般都是maven管理,当然还有gradle,对于包的管理非常方便,maven的话只要在pom.xml中添加依赖包的maven坐标就可以了的,那python呢 ? 解决方 ...
- (简单易懂)Java的快速失败(fail-fast)与安全失败,源码分析+详细讲解
之前在程序中遇到快速失败的问题,在网上找解释时发现网上的问题总结都比较片面,故打算自己总结一个,也可以供以后参考. --宇的季节 首先什么是快速失败? 快速失败是为了提示程序员在多线程的情况下不要用线 ...
- 4_SSRF
SSRF SSRF(服务请求伪造)是一种由攻击者构造形成由服务器端发起请求的一个安全漏洞,它将一个可以发起网络请求的服务当作跳板来攻击其他服务器,SSRF的攻击目标一般是内网.当服务器提供了从其他服务 ...
- 【浅谈web安全】大企业安全:从员工下手
目前所有的企业都存在这方面的问题,比如员工把服务器和后台密码直接明文保存在云笔记和网盘中,员工企业邮箱密码跟外部个人密码一致等等,通常我们在入侵的时候只要在微博搜索一个目标公司的员工,拿到常用密码后登 ...