list循環背後的故事
今天開始我們來聊一聊集合的那些事。說到集合,最最最常用的方法估計就是遍歷了。那我們就從遍歷來開始深入集合。
準備數據
先新建一個ArrayList,本文中就直接採用了直接add字符串的方式,實際開發中,實體類會複雜的多。
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
開始遍歷
fori方式遍歷
代碼如下:
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
使用javap
可以看到for翻譯成了goto , 其他size,get等方法照舊:
javap -v -p 類名
for(T t:list)方式遍歷
代碼如下:
for (String s : list) {
System.out.println(s);
}
使用javap
可以看到
for(T t :list) 實際上調用的是list的 iterator,通過hasNext 和next 來實現遍歷的。也就是和下面代碼的效果是一樣的:
foreach 方式遍歷
代碼如下:
list.forEach(x-> System.out.println(x));
只有一行代碼就可以了,但實際上,這是一個語法糖,我們點進去forEach
可以看到:
再根據我們上面的分析,等同於調用iterator進行遍歷。
總結
在java世界中,爲了方便開發,jdk給我們提供了很多便利的方法。但追根到底,會有種百川入海的感覺,最終調用的還是那幾個基礎方法。如上文所述,foreach 實際上調用是的 for(T t :list)。 for(T t :list)實際上調用的是iterator的next。如果我們再跟蹤下去會發現,arraylist 實際上就是一個Object[] elementData
我們調用iterator.next 實際上就是用的elementData[i]
:
歡迎大家關注公衆號:java技術大本營, 質量內容號,專心寫好每一篇技術文。歡迎留言一起討論