成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對于Java中的For循環和Foreach,哪個更快

開發 前端
對于Java中的For循環和Foreach,哪個更快?通過本文,您可以了解一些集合遍歷技巧。

?Java遍歷集合有兩種方法。一個是最基本的for循環,另一個是jdk5引入的for each。通過這種方法,我們可以更方便地遍歷數組和集合。但是你有沒有想過這兩種方法?哪一個遍歷集合更有效?

for-each實現方法

For-each不是一種新語法,而是Java的語法糖。在編譯時,編譯器將此代碼轉換為迭代器實現,并將其編譯為字節碼。

語法糖:

語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。

我們可以通過執行命令javap-verbose-Testforeach反編譯以下編譯代碼:

public class TestForeach {
List<Integer> integers;
public void testForeach(){
for(Integer i : integers){

}
}
}

獲得的詳細字節碼如下:

public void testForeach();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: aload_0
1: getfield #2 // Field integers:Ljava/util/List;
4: invokeinterface #3, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
9: astore_1
10: aload_1
11: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
16: ifeq 32
19: aload_1
20: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
25: checkcast #6 // class java/lang/Integer
28: astore_2
29: goto 10
32: return
LineNumberTable:
line 11: 0
line 13: 29
line 14: 32
LocalVariableTable:
Start Length Slot Name Signature
29 0 2 i Ljava/lang/Integer;
0 33 0 this Ltest/TestForeach;
}

此字節碼的一般含義是使用getfileld命令來獲取integers變量并且調用List.iterator來獲取迭代器實例和調用iterator.hasNext。如果返回true,調用iterator.next方法。

請看,這是迭代器遍歷集合的實現邏輯。

基準測試

現在讓我們使用for循環方法和for-each方法進行測試。

public class ForLoopTest {

public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
arrayList.add(i);
}

long arrayListStartTime = System.currentTimeMillis();
for (int i = 0; i < arrayList.size(); i++) {
arrayList.get(i);
}

long arrayListCost =System.currentTimeMillis()-arrayListStartTime;
System.out.println("ArrayList for loop traversal cost: "+ arrayListCost);

long arrayListForeachStartTime = System.currentTimeMillis();
for (Integer integer : arrayList) {

}

long arrayListForeachCost =System.currentTimeMillis()-arrayListForeachStartTime;
System.out.println("ArrayList foreach traversal cost: "+ arrayListForeachCost);

這是測試結果:

如你所見,結果是顯而易見的。對于ArrayList,使用For循環方法的性能優于For each方法。

我們可以說for循環比for-each好嗎?

答案是否定的。在下一個基準測試中,我們將ArrayList更改為LinkedList。 同樣,這里是測試結果。

原因分析

一些初學者可能想知道為什么ArrayList使用for循環方法遍歷得更快,而LinkedList則更慢,速度也非常慢?

這由ArrayList和LinkedList數據結構決定。 ArrayList底層使用數組存儲元素。數組是連續的內存空間。數據可以通過索引獲得。時間復雜度為O(1),因此速度很快。

LinkedList的底層是一個雙向鏈表。使用for循環實現遍歷,每次都需要從鏈表的頭節點開始。時間復雜度為O(n*n)。

結論

  1. 使用ArrayList時,for循環方法更快,因為for-each由迭代器實現,并且需要執行并發修改驗證。
  2. 使用LinkedList時,for-each比for循環快得多,因為LinkedList是通過使用雙向鏈表實現的。每個尋址都需要從頭節點開始。如果我們需要遍歷LinkedList,我們需要避免使用for循環。
  3. 使用迭代器模式,for-each不需要關心集合的具體實現。如果需要替換集合,無需修改代碼即可輕松替換。?
責任編輯:華軒 來源: 今日頭條
相關推薦

2022-09-07 11:52:48

forforEach前端

2009-08-28 17:18:55

foreach循環

2024-03-11 01:00:00

jsfor循環

2024-08-30 08:43:24

JavaScriptforEachfor循環

2017-02-22 14:09:31

Javaforeach反編譯

2016-12-20 15:35:52

Java堆本地內存

2020-09-22 12:53:37

JavaScript循環可枚舉

2023-12-19 16:43:01

2020-12-22 14:11:45

JS forEach()map()

2022-01-17 07:50:36

Maven Gradle 工具

2023-08-11 17:13:39

JavaScrip

2021-11-07 14:37:59

列表編碼扁平化

2009-12-07 14:38:14

PHP foreach

2023-10-27 15:31:04

For循環Foreach循環

2009-04-07 09:07:27

Googlechrome瀏覽器

2025-04-14 10:35:00

for 循環

2020-08-02 23:20:36

JavaScriptmap()forEach()

2020-11-11 11:02:53

5GWi-Fi 6技術

2023-01-08 20:49:46

NPS驗證優化

2009-11-27 09:34:38

VS2003命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美中文字幕一区二区三区亚洲 | 国产精品免费看 | 欧美中文 | 日韩欧美天堂 | 九九久久精品视频 | 久草网在线视频 | 成人av网页 | 91伊人 | 激情毛片 | 成人网视频| 在线看日韩 | 久久中文字幕一区 | 欧美a在线 | 亚洲精品综合 | 精品欧美久久 | 最新中文字幕在线 | 一区二区三区在线看 | 日韩视频一区二区 | 日韩国产精品一区二区三区 | 操射视频| 精品国产一区二区三区性色 | 嫩草国产| 日韩av成人在线 | av激情在线 | 日本久久一区二区三区 | 毛片a| 欧美在线视频一区 | 超碰地址| 久久久.com | 婷婷亚洲综合 | 国产精品免费在线 | 欧美日本在线 | 在线视频中文字幕 | 91福利影院 | 欧美aaaaa| 91网站在线观看视频 | 精品国产乱码久久久久久88av | 免费不卡视频 | 一级片在线免费播放 | 日韩精品一区二区三区中文在线 | 国产精品一区二区欧美黑人喷潮水 |