Skip to content

Commit f79bf34

Browse files
authored
魔法-创生
1 parent 1b23312 commit f79bf34

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

ChaosCrystal/List循环性能.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+

0 commit comments

Comments
 (0)