您的位置:首页 > 其它

Arraylist和linkedlist的性能测试

2016-04-06 13:45 417 查看

1,通过源码角度分析Arraylist和 linkedlist的性能如下:

Add()

Remove(int i)

Set(int i, E e)

Get(int i)

Arraylist

O(1)-O(N)

O(N)

O(1)

O(1)

Linkedlist

O(1)

O(N)

O(N)

O(N)

2,这篇文章主要是通过用例测试来了解Arraylist和linkedlist的性能。代码如下:

package JavaTest.List.Testone;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
* @author weibinbin
*
*/
public class ListCompareTest {

private static final int COUNT = 100000;
private static LinkedList linkedList = new LinkedList();
private static ArrayList arrayList = new ArrayList();

public static void main(String[] args) {
// 换行符
System.out.println();
// 插入
insert(linkedList);
insert(arrayList);
// 换行符
System.out.println();
// 修改
setByPosition(linkedList);
setByPosition(arrayList);
// 换行符
System.out.println();
// 随机读取
readByPosition(linkedList);
readByPosition(arrayList);
//换行符
System.out.println();
// 删除
deleteByPosition(linkedList);
deleteByPosition(arrayList);
}

// 获取list的名称
private static String getListName(List list) {
if (list instanceof LinkedList) {
return "LinkedList";
} else if (list instanceof ArrayList) {
return "ArrayList";
} else {
return "List";
}
}

// 向list的指定位置插入COUNT个元素,并统计时间
private static void insert(List list) {
long startTime = System.currentTimeMillis();
// 向list的位置0插入COUNT个数
for (int i = 0; i < COUNT; i++)
list.add(i);
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(getListName(list) + " : insert " + COUNT
+ " elements into the 1st position use time:" + interval
+ " ms");
}

// 根据position,不断从list中读取元素,并统计时间
private static void setByPosition(List list) {
long startTime = System.currentTimeMillis();
// 读取list元素
for (int i = 0; i < COUNT; i++)
list.set(i, 0);
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(getListName(list) + " : set" + COUNT
+ " elements by position use time:" + interval + " ms");
}

// 从list的指定位置删除COUNT个元素,并统计时间
private static void deleteByPosition(List list) {
long startTime = System.currentTimeMillis();
// 删除list第一个位置元素
for (int i = 0; i<COUNT; i++)
list.remove(0);
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(getListName(list) + " : delete " + COUNT
+ " elements from the 1st position use time:" + interval
+ " ms");
}

// 根据position,不断从list中读取元素,并统计时间
private static void readByPosition(List list) {
long startTime = System.currentTimeMillis();
// 读取list元素
for (int i = 0; i < COUNT; i++)
list.get(i);
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(getListName(list) + " : read " + COUNT
+ " elements by position use time:" + interval + " ms");
}

}


3,实验的数据结果如下:

Add()

Remove(int i)

Set(int i, E e)

Get(int i)

Arraylist

16ms

1149ms

1ms

4ms

Linkedlist

15ms

0ms

6511ms

6542ms

4,结果分析

实验结果基本和预期的源码分析结果一致,只是在linkedlist在删除数据的时候,性能突然大幅度的提高,主要是因为在删除的时候,删除的是链表的头指针所指向的元素,并不需要遍历链表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: