public static void main(String[] args) {
int SIZE = 100000;
/**
* 尾插
*/
List<String> al = new ArrayList<>();
long start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al.add("a");
}
System.out.println("al tail add:" + (System.nanoTime() - start));
List<String> ll = new LinkedList<>();
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll.add("a");
}
System.out.println("ll tail add:" + (System.nanoTime() - start));
List<String> al1 = new ArrayList<>(SIZE);
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al1.add("a");
}
System.out.println("fixed al tail add:" + (System.nanoTime() - start));
List<String> ll1 = new LinkedList<>();
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll1.add("a");
}
System.out.println("fixed ll tail add:" + (System.nanoTime() - start));
/**
* 头插
*/
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al.add(0, "a");
}
System.out.println("al head add:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll.add(0, "a");
}
System.out.println("ll head add:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al1.add(0, "a");
}
System.out.println("fixed al head add:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll1.add(0, "a");
}
System.out.println("fixed ll head add:" + (System.nanoTime() - start));
/**
* 中插
*/
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al.add(SIZE/2, "a");
}
System.out.println("al middle add:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll.add(SIZE/2, "a");
}
System.out.println("ll middle add:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al1.add(SIZE/2, "a");
}
System.out.println("fixed al middle add:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll1.add(SIZE/2, "a");
}
System.out.println("fixed ll middle add:" + (System.nanoTime() - start));
/**
* 顺序查
*/
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al.get(i);
}
System.out.println("al get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll.get(i);
}
System.out.println("ll get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
al1.get(i);
}
System.out.println("fixed al get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = 0; i < SIZE; i++) {
ll1.get(i);
}
System.out.println("fixed ll get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
al.get(i);
}
System.out.println("al get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
ll.get(i);
}
System.out.println("ll get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
al1.get(i);
}
System.out.println("fixed al get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
ll1.get(i);
}
System.out.println("fixed ll get:" + (System.nanoTime() - start));
/**
* 随机查
*/
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
al.get(new Random().nextInt(SIZE));
}
System.out.println("al random get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
ll.get(new Random().nextInt(SIZE));
}
System.out.println("ll random get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
al1.get(new Random().nextInt(SIZE));
}
System.out.println("fixed al random get:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
ll1.get(new Random().nextInt(SIZE));
}
System.out.println("fixed ll random get:" + (System.nanoTime() - start));
/**
* 随机删
*/
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
al.remove(new Random().nextInt(SIZE));
}
System.out.println("al random remove:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
ll.remove(new Random().nextInt(SIZE));
}
System.out.println("ll random remove:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
al1.remove(new Random().nextInt(SIZE));
}
System.out.println("fixed al random remove:" + (System.nanoTime() - start));
start = System.nanoTime();
for (int i = SIZE - 1; i > 0; i--) {
ll1.remove(new Random().nextInt(SIZE));
}
System.out.println("fixed ll random remove:" + (System.nanoTime() - start));
}
运行结果:
al tail add:3476287
ll tail add:12657766
fixed al tail add:2349552
fixed ll tail add:3199254
al head add:4009849812
ll head add:11752717
fixed al head add:3359037325
fixed ll head add:3220743
al middle add:4505144487
ll middle add:10911259343
fixed al middle add:4503587278
fixed ll middle add:9124624321
al get:2470068
ll get:10483634464
fixed al get:2263320
fixed ll get:9477721595
al get:2190044
ll get:10480103479
fixed al get:2072280
fixed ll get:9486833340
al random get:16256970
ll random get:10378181703
fixed al random get:9590445
fixed ll random get:9559484091
al random remove:4223582539
ll random remove:14814423490
fixed al random remove:4232083623
fixed ll random remove:13570980099
结论:LinkedList仅在头插情况下有优势,本文其他测试例下均逊于ArrayList。中插和随机删按常规预估应该是LinkedList快,但实际还是不如ArrayList。原因:大量数据的情况下,ArrayList的System.arraycopy的效率要比LinkedList从端开始查找index和分配node快。