public class ListPerformance {
private static final int PERPS = 1000;
private abstract static class Tester{
String name;
int size;
/**
* @param name
* @param size
*/
Tester(String name, int size) {
this.name = name;
this.size = size;
}
abstract void test(List a);
}
private static Tester[] tests = {
new Tester("add",300) {
void test(List a) {
for(int i =0; i < PERPS; i++){
for(int j = 0; j < size;j++){
a.add((i+"")+(j+""));
}
}
}
},
new Tester("get",300) {
void test(List a) {
for(int i =0; i < PERPS; i++){
for(int j = 0; j < size;j++){
a.get(j);
}
}
}
},
new Tester("iterator",300) {
@Override
void test(List a) {
for(int i =0; i < PERPS; i++){
Iterator iterator = a.iterator();
while(iterator.hasNext()){
iterator.next();
}
}
}
},
new Tester("insert",1000) {
@Override
void test(List a) {
int half = a.size()/2;
String testStr = "test";
ListIterator it = a.listIterator(half);
for(int i = 0; i< size*10; i++){
it.add(testStr);
}
}
}
};
public static void test(List a){
System.out.println("tesing:" + a.getClass().getName());
for(int i = 0;i < tests.length;i++){
System.out.print(tests[i].name);
long t1 = System.currentTimeMillis();
tests[i].test(a);
long t2 = System.currentTimeMillis();
System.out.println(":"+(t2-t1));
}
}
public static void main(String[] args) {;
ArrayList arrayList = new ArrayList<>();
LinkedList linkList = new LinkedList<>();
test(arrayList);
test(linkList);
System.out.println();
}
}ArrayList LinkedList 效率对比
add | get | iterator | insert | remove | |
ArrayList | 122 | 7 | 50 | 788 | 7478 |
LinkedList | 75 | 76 | 10923 | 9 | 29 |
ArrayList 随机 插入 删除慢 查询 循环 快 底层是数组 连续的内存地址
LinkedList 随机 插入 删除快 查询 循环 慢 底层是链表 对象引用,不是连续的内存地址
注:别用for循环遍历LinkedList,用迭代器,有兴趣的同学自己试试。