学习了数组和链表结构的区别后,以一千万条数据测试。
代码如下:
// 数据条数
static int nums = 10000000;
public static void main(String[] args) {
List arrayList = new ArrayList();
List linkedList = new LinkedList();
log.info("*****这里是从尾端add测试*****");
long arrayStartTime = System.currentTimeMillis();
for (int i = 0; i < nums; i++) {
arrayList.add(i);
}
log.info("ArrayList结束,耗时:{}毫秒。", System.currentTimeMillis() - arrayStartTime);
long linkedStartTime = System.currentTimeMillis();
for (int i = 0; i < nums; i++) {
linkedList.add(i);
}
log.info("LinkedList结束,耗时:{}毫秒。", System.currentTimeMillis() - linkedStartTime);
log.info("*****这里是从头部add测试*****");
long arrayStartTime1 = System.currentTimeMillis();
arrayList.add(1, 111);
log.info("ArrayList结束,耗时:{}毫秒。", System.currentTimeMillis() - arrayStartTime1);
long linkedStartTime1 = System.currentTimeMillis();
linkedList.add(1, 111);
log.info("LinkedList结束,耗时:{}毫秒。", System.currentTimeMillis() - linkedStartTime1);
log.info("*****这里是从尾部remove测试*****");
long arrayStartTime2 = System.currentTimeMillis();
arrayList.remove(9999999);
log.info("ArrayList结束,耗时:{}毫秒。", System.currentTimeMillis() - arrayStartTime2);
long linkedStartTime2 = System.currentTimeMillis();
linkedList.remove(9999999);
log.info("LinkedList结束,耗时:{}毫秒。", System.currentTimeMillis() - linkedStartTime2);
System.out.println(arrayList.size());
System.out.println(linkedList.size());
log.info("*****这里是从尾部get测试*****");
long arrayStartTime3 = System.currentTimeMillis();
System.out.println(arrayList.get(9999999));
log.info("ArrayList结束,耗时:{}毫秒。", System.currentTimeMillis() - arrayStartTime3);
long linkedStartTime3 = System.currentTimeMillis();
System.out.println(linkedList.get(9999999));
log.info("LinkedList结束,耗时:{}毫秒。", System.currentTimeMillis() - linkedStartTime3);
}
这次简单测试的结果:
1、ArrayList的查找性能绝对是一流的,无论查询的是哪个位置的元素
2、ArrayList除了尾部插入的性能较好外(位置越靠后性能越好),其他位置性能就不如人意了
3、LinkedList在头尾查找、插入性能都是很棒的,但是在中间位置进行操作的话,性能就差很远了,而且跟ArrayList完全不是一个量级的
关于第二条的解释,linkedlist是双链表结构,初始化会自动保存头、尾两节点,所以两端开始linkedlist插入性能较好