ArrayList 与 LinkedList 都是list的实现 类,前者是基于数组实现,具有查询快增删慢的特点,后者是基于双向链表实现,具有查询慢增删快的特点,对于查询与增删来说,二者正好相反,那二者到底相差多少
下面我们来测试下,
先上代码,所有代码如下
package com.test.list;
import java.util.*;
/**
* @ClassName ListDemo
* @Description TODO
* @Date 2018/11/20/02015:29
* @Version 1.0
**/
public class ListDemo {
public static void main(String[] args) {
int baseSize = 10000;
int baseGet = 100;
// addListXiaoLv(2000*baseSize);
// addLinkListXiaoLv(2000*baseSize);
// getListXiaoLv(2000*baseSize,baseGet);
// getLinkListXiaoLv(2000*baseSize,baseGet);
}
/**
* 增加list数据
* @param size
*/
public static void addListXiaoLv(int size){
List list = new ArrayList(size);
Long listStart = System.currentTimeMillis();
for (int i =0;i<size;i++){
list.add(i);
}
Long listEnd = System.currentTimeMillis();
System.out.println(" ArrayList 增加时间" +(listEnd-listStart));
}
/**
* 增加LinkList的数据
* @param size
*/
public static void addLinkListXiaoLv(int size){
List list = new LinkedList();
Long listStart = System.currentTimeMillis();
for (int i =0;i<size;i++){
list.add(i);
}
Long listEnd = System.currentTimeMillis();
System.out.println(" LinkedList 增加时间" +(listEnd-listStart));
}
/**
* 随机获取 list中的数据
* @param size
* @param get
*/
public static void getListXiaoLv(int size,int get){
List list = new ArrayList();
for (int i =0;i<size;i++){
list.add(i);
}
List getlist = new ArrayList();
Long listStart = System.currentTimeMillis();
for (int i = 0; i<get;i++){
getlist.add(list.get(new Random().nextInt(size)));
}
Long listEnd = System.currentTimeMillis();
System.out.println(" ArrayList 获取时间" +(listEnd-listStart));
System.out.println("list .size" +list.size());
System.out.println("getlist .size" +getlist.size());
}
/**
* 随机获取 LinkList中的数据
* @param size
* @param get
*/
public static void getLinkListXiaoLv(int size,int get){
List list = new LinkedList();
List getlist = new LinkedList();
for (int i =0;i<size;i++){
list.add(i);
}
Long listStart = System.currentTimeMillis();
for (int i =0;i<get;i++){
getlist.add(list.get(new Random().nextInt(size)));
}
Long listEnd = System.currentTimeMillis();
System.out.println(" LinkedList 获取时间" +(listEnd-listStart));
System.out.println("list .size" +list.size());
System.out.println("getlist .size" +getlist.size());
}
}
数据增加以万为基本单位,分别有 万,10万,100万,1000万,2000万
由于ArrayList可以初始size,并分别以初始化和未初始化做了性能对比
查询数据分别从万,10万,100万,1000万,2000万 中随机获取100条
具体耗时与性能比较如下,
注: 所有结果统计单位为毫秒,性能对比有正负之分,正为性能提升,负为性能降低
增加数据 | ||||||
ArrayList | LinkedList | |||||
数据量 | 未初化size(变量A) | 初始化size(变量B) | 初始化的性能提升((A-B)/A * 100%) | 不能初始化(变量C) | 与未size的arrayList比((A-C)/A * 100%) | 与已size的arrayList比((B-C)/B * 100%) |
1万 | 2 | 2 | 0 | 2 | 0 | 0 |
10万 | 8 | 7 | 12% | 8 | 0 | -15% |
100万 | 32 | 22 | 30% | 42 | -30% | -90% |
1000万 | 400 | 257 | 36% | 6891 | -1600% | -2500% |
2000万 | 4873 | 5635 | -16% | 15827 | -200% | -180% |
查询数据(随机查询100) | ||||||
1万 | 1 | 1 | 0 | 4 | -300% | -300% |
10万 | 1 | 1 | 0 | 13 | -1200% | -1200% |
100万 | 1 | 1 | 0 | 104 | -10300% | -10300% |
1000万 | 1 | 1 | 0 | 1865 | -186400% | -186400% |
2000万 | 0 | 0 | 0 | 4908 | ....... | ....... |
根据文中开始的总结,要想查询快用Arrylist,增加快用LinkedList,但是实际测试结果,无论做什么,都Arrylist快