ArrayList和LinkedList的操作性能对比
2016-05-10 18:11
417 查看
ArrayList和LinkedList都是实现了Collection和List接口,继承AbstractList的链表。
ArrayList:
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)
LinkedList::
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾get、remove 和insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列 (deque)。
下面就根据几个示例才测试一下它们之间使用的性能区别:
我们创建一个成员变量List list;在不同的testcase中分别实例化为ArrayList和LinkedList,然后往各个列表中添加100000条数据,根据操作前后的时间差来判断他们的插入性能;
[java] view
plain copy
package org.wxp.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
/**
* 测试LinkedList和ArrayList的添加性能
*
* @author Champion.Wong
*
*/
public class Test_List01 extends TestCase {
private List list = null;
private long start = 0;
private long end = 0;
/**
* 测试LinkedList的插入性能
*/
public void test() {
list = new LinkedList();
start = System.currentTimeMillis(); // 记录执行操作前时间
for (int i = 0; i < 1000000; i++) {
list.add("Hello java.");
}
end = System.currentTimeMillis();// 记录执行操作后时间
System.out.println("LinkedList用时:" + (end - start));
}
/**
* 测试ArrayList的插入性能
*/
public void test1() {
list = new ArrayList();
start = System.currentTimeMillis();// 记录执行操作前时间
for (int i = 0; i < 1000000; i++) {
list.add("Hello java.");
}
end = System.currentTimeMillis();// 记录执行操作后时间
System.out.println("ArrayList用时:" + (end - start));
}
}
执行后的控制台结果为:
我们创建一个成员变量List list;在不同的testcase中分别实例化为ArrayList和LinkedList,然后往各个列表中添加100000条数据。然后遍历这些集合,根据操作前后的时间差来判断他们的插入性能;
[java] view
plain copy
package org.wxp.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
/**
* 测试LinkedList和ArrayList的遍历性能
*
* @author Champion.Wong
*
*/
public class Test_List02 extends TestCase {
private List list = null;
private long start = 0;
private long end = 0;
public void test() {
list = new LinkedList();
for (int i = 0; i < 100000; i++) {
list.add("Hello Java!");
}
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.get(i);
}
end = System.currentTimeMillis();
System.out.println("LinkedList用时:" + (end - start));
}
public void test1() {
list = new ArrayList();
for (int i = 0; i < 100000; i++) {
list.add("Hello Java!");
}
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.get(i);
}
end = System.currentTimeMillis();
System.out.println("ArrayList用时:" + (end - start));
}
}
执行之后的结果为:
再看看Junit控制台的显示情况:
我们分别在两个方法里定义一个ArrayList和LinkedList,分别往每个集合中插入100000条数据。ArrayList使用add(object)方法来插入,而LinkedList则使用独自的addFirst(object)和addLast(object)来进行收尾同时插入。
[java] view
plain copy
package org.wxp.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
/**
* 测试LinkedList和ArrayList的首位操作性能
*
* @author Champion.Wong
*
*/
public class Test_List03 extends TestCase {
private long start = 0;
private long end = 0;
public void test() {
LinkedList list = new LinkedList();
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.addFirst("hello first!");
list.addLast("hello first!");
}
end = System.currentTimeMillis();
System.out.println("LinkedList用时:" + (end - start));
}
public void test1() {
ArrayList list = new ArrayList();
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.add("hello first");
list.add("hello last");
}
end = System.currentTimeMillis();
System.out.println("ArrayList用时:" + (end - start));
}
}
再来看看执行结果:
由以上测试结果可以看出:
ArrayList在遍历和普通插入(add(object))的性能上都优于LinkedList。但是LinkedList在首尾进行操作的性能上明显优于ArrayList.
并且,ArrayList和LinkedList的操作方法都不是同步的,在并发操作时,不能保证其合理性,在创建的时候可以保证外部同步:
[java] view
plain copy
List arrayList = Collections.synchronizedList(new ArrayList(...));
List linkedList = Collections.synchronizedList(new LinkedList(...));
转载请注明出处:http://blog.csdn.net/it_wangxiangpan/article/details/8693803
ArrayList:
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)
LinkedList::
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾get、remove 和insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列 (deque)。
下面就根据几个示例才测试一下它们之间使用的性能区别:
我们创建一个成员变量List list;在不同的testcase中分别实例化为ArrayList和LinkedList,然后往各个列表中添加100000条数据,根据操作前后的时间差来判断他们的插入性能;
[java] view
plain copy
package org.wxp.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
/**
* 测试LinkedList和ArrayList的添加性能
*
* @author Champion.Wong
*
*/
public class Test_List01 extends TestCase {
private List list = null;
private long start = 0;
private long end = 0;
/**
* 测试LinkedList的插入性能
*/
public void test() {
list = new LinkedList();
start = System.currentTimeMillis(); // 记录执行操作前时间
for (int i = 0; i < 1000000; i++) {
list.add("Hello java.");
}
end = System.currentTimeMillis();// 记录执行操作后时间
System.out.println("LinkedList用时:" + (end - start));
}
/**
* 测试ArrayList的插入性能
*/
public void test1() {
list = new ArrayList();
start = System.currentTimeMillis();// 记录执行操作前时间
for (int i = 0; i < 1000000; i++) {
list.add("Hello java.");
}
end = System.currentTimeMillis();// 记录执行操作后时间
System.out.println("ArrayList用时:" + (end - start));
}
}
执行后的控制台结果为:
我们创建一个成员变量List list;在不同的testcase中分别实例化为ArrayList和LinkedList,然后往各个列表中添加100000条数据。然后遍历这些集合,根据操作前后的时间差来判断他们的插入性能;
[java] view
plain copy
package org.wxp.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
/**
* 测试LinkedList和ArrayList的遍历性能
*
* @author Champion.Wong
*
*/
public class Test_List02 extends TestCase {
private List list = null;
private long start = 0;
private long end = 0;
public void test() {
list = new LinkedList();
for (int i = 0; i < 100000; i++) {
list.add("Hello Java!");
}
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.get(i);
}
end = System.currentTimeMillis();
System.out.println("LinkedList用时:" + (end - start));
}
public void test1() {
list = new ArrayList();
for (int i = 0; i < 100000; i++) {
list.add("Hello Java!");
}
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.get(i);
}
end = System.currentTimeMillis();
System.out.println("ArrayList用时:" + (end - start));
}
}
执行之后的结果为:
再看看Junit控制台的显示情况:
我们分别在两个方法里定义一个ArrayList和LinkedList,分别往每个集合中插入100000条数据。ArrayList使用add(object)方法来插入,而LinkedList则使用独自的addFirst(object)和addLast(object)来进行收尾同时插入。
[java] view
plain copy
package org.wxp.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
/**
* 测试LinkedList和ArrayList的首位操作性能
*
* @author Champion.Wong
*
*/
public class Test_List03 extends TestCase {
private long start = 0;
private long end = 0;
public void test() {
LinkedList list = new LinkedList();
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.addFirst("hello first!");
list.addLast("hello first!");
}
end = System.currentTimeMillis();
System.out.println("LinkedList用时:" + (end - start));
}
public void test1() {
ArrayList list = new ArrayList();
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.add("hello first");
list.add("hello last");
}
end = System.currentTimeMillis();
System.out.println("ArrayList用时:" + (end - start));
}
}
再来看看执行结果:
由以上测试结果可以看出:
ArrayList在遍历和普通插入(add(object))的性能上都优于LinkedList。但是LinkedList在首尾进行操作的性能上明显优于ArrayList.
并且,ArrayList和LinkedList的操作方法都不是同步的,在并发操作时,不能保证其合理性,在创建的时候可以保证外部同步:
[java] view
plain copy
List arrayList = Collections.synchronizedList(new ArrayList(...));
List linkedList = Collections.synchronizedList(new LinkedList(...));
转载请注明出处:http://blog.csdn.net/it_wangxiangpan/article/details/8693803
相关文章推荐
- python xmlrpc实现二进制文件传输的代码,简单的远程调用
- 与管道相关的几个命令处理
- 2dx-lua quick打包去掉蓝色启动页
- 利用pscp实现从putty远程终端复制文件到本地windows操作系统
- 欢迎使用CSDN-markdown编辑器
- MTK 开机黑屏很长时间
- C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作
- robotium从入门到放弃 三 基于apk的自动化测试
- MDI多文档模板中tab切换事件消息处理定义
- ansible学习笔记(二) -- roles
- Oracle 11.2.0.4.5 RAC升级OJVM_11.2.0.4.160419_psu出现的问题
- c++作业5
- Thinkphp中自己组合的数据怎样使用框架的分页
- CodeForces - 670D2 Magic Powder - 2 (二分&模拟)
- 性能评测方法、各评测项标准总结
- CUDA之——VS调试出现“无法查找或打开 PDB 文件”的警告
- c++作业5
- Android—进度条
- HDU 5236 Article(概率dp+贪心)
- 这些道理没人告诉你读书笔记