java List集合

LinkedListArrayList对比

使用场景:

  • LinkedList 需要快速插入,删除元素。
  • ArrayList 快速随机访问元素

加上stackvector对比,插入读取和删除的耗时性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Stack : insert 100000  use time:1640 ms
Vector : insert 100000 use time:1607 ms
LinkedList : insert 100000 use time:29 ms
ArrayList : insert 100000 use time:1617 ms

Stack : read 100000 use time:9 ms
Vector : read 100000 use time:6 ms
LinkedList : read 100000 use time:10809 ms
ArrayList : read 100000 use time:5 ms

Stack : delete 100000 use time:1916 ms
Vector : delete 100000 use time:1910 ms
LinkedList : delete 100000 use time:15 ms
ArrayList : delete 100000 use time:1909 ms

参考:Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

ArrayList和LinkedList的几种循环遍历方式及性能对比分析

Effetive java中推荐使用foreach方法:

foreach的一大好处,简单一行实现了四行的功能,使得代码简洁美观,另一大好处是相对于下标循环而言的,foreach不必关心下标初始值和终止值及越界等,所以不易出错

注意:froeach内部也就是使用iterator来遍历。

分别使用foreachiterator,size(),size=lst.size()以及j--用于ArrayListLinkList遍历的耗时分析:

ArrayList
list size 10,000 100,000 1,000,000 10,000,000
for each 1 ms 3 ms 14 ms 152 ms
for iterator 0 ms 1 ms 12 ms 114 ms
for list.size() 1 ms 1 ms 13 ms 128 ms
for size = list.size() 0 ms 0 ms 6 ms 62 ms
for j— 0 ms 1 ms 6 ms 63 ms
  1. 在ArrayList大小为十万之前,五种遍历方式时间消耗几乎一样
  2. 在十万以后,第四、五种遍历方式快于前三种,get方式优于Iterator方式
LinkedList
list size 100 1,000 10,000 100,000
for each 0 ms 1 ms 1 ms 2 ms
for iterator 0 ms 0 ms 0 ms 2 ms
for list.size() 0 ms 1 ms 73 ms 7972 ms
for size = list.size() 0 ms 0 ms 67 ms 8216 ms
for j— 0 ms 1 ms 67 ms 8277 ms

得出:在LinkedList大小接近一万时,get方式和Iterator方式就已经差了差不多两个数量级,十万时Iterator方式性能已经远胜于get方式

数组与List集合转化

  • 使用Collections.addAll

    1
    2
    3
    String[] userid = {"aa","bb","cc"};
    List<String> userList = new ArrayList<String>();
    Collections.addAll(userList, userid);
  • 使用:Arrays.asList()

    注意返回一个受指定数组支持的固定大小的列表。所以不能做Add、Remove等操作。,我们可以使用new ArrayList()进行转换

    1
    2
    String[] userid = {"aa","bb","cc"};
    List<String> userList = Arrays.asList(userid);

当使用集合转化为数组时:使用toArray()