File tree Expand file tree Collapse file tree 1 file changed +57
-0
lines changed
Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Original file line number Diff line number Diff line change 1+ # List的循环性能
2+
3+ 我们常用的List有两种,ArrayList和LinkedList,但由于内部存储结构的不同,使用不同的遍历方法引起的效果则是千差万别的。
4+
5+ List | 存储结构 | 特点
6+ ---|---|---
7+ ArrayList | 数组结构 | 可以根据下标直接取值
8+ LinkedList | 链表结构 | 如果需要寻找某一个下标的数值必须从头遍历
9+
10+ 我们在遍历List的时候可能会这样做:
11+
12+ ``` java
13+ public void loopList(List<Integer > lists) {
14+ for (int i= 0 ; i< lists. size(); i++ ) {
15+ Integer integer = lists. get(i);
16+ // TODO 处理数据
17+ }
18+ }
19+ ```
20+
21+ 这种做法很直观,乍一看并没有什么问题,但是仔细分析一下就能知道,在这种情况下使用ArrayList与LinkedList性能是完全不同的。
22+
23+ List | 循环时间复杂度 | get(i)时间复杂度 | 总时间复杂度
24+ ---|:---:|:---:|:---:
25+ ArrayList | O(n) | O(1) | O(n)
26+ LinkedList | O(n) | O(n) | O(n<sup >2</sup >)
27+
28+ 从时间复杂度上两者就直接差了一个数量级,可能这样说不明显,为了直观的表示,下面用代码测试处理10000条数据效率:
29+
30+ 测试代码:
31+ ```
32+ ArrayList<Integer> arrayList = new ArrayList<>();
33+ LinkedList<Integer> linkedList = new LinkedList<>();
34+ for (int i=0; i<10000; i++){
35+ arrayList.add(i);
36+ linkedList.add(i);
37+ }
38+
39+ long startTime1=System.currentTimeMillis(); //获取开始时间
40+ loopList(arrayList);
41+ long endTime1=System.currentTimeMillis(); //获取结束时间
42+ Log.i(TAG, "ArrayList: "+(endTime1-startTime1)+"ms");
43+
44+ long startTime2=System.currentTimeMillis(); //获取开始时间
45+ loopList(linkedList);
46+ long endTime2=System.currentTimeMillis(); //获取结束时间
47+ Log.i(TAG, "LinkedList:"+(endTime2-startTime2)+"ms");
48+ ```
49+
50+ 结果:
51+
52+ ``` shell
53+ com.gcssloop.alltest I/MainActivity: ArrayList: 9ms
54+ com.gcssloop.alltest I/MainActivity: LinkedList:709ms
55+ ```
56+
57+
You can’t perform that action at this time.
0 commit comments