Java for each實現(xiàn)機制代碼原理解析
源測試代碼如下
public class ForEachTest {
public void test4Iterate(Iterable<String> strings) {
for (String str : strings) {
System.out.println(str);
}
}
public void test4Array(String[] strings) {
for (String str : strings) {
System.out.println(str);
}
}
}
執(zhí)行編譯命令
javac ForEachTest.java
使用idea查看反編的Java文件
import java.util.Iterator;
public class ForEachTest {
public ForEachTest() {
}
public void test4Iterate(Iterable<String> var1) {
Iterator var2 = var1.iterator();
while(var2.hasNext()) {
String var3 = (String)var2.next();
System.out.println(var3);
}
}
public void test4Array(String[] var1) {
String[] var2 = var1;
int var3 = var1.length;
for(int var4 = 0; var4 < var3; ++var4) {
String var5 = var2[var4];
System.out.println(var5);
}
}
}
執(zhí)行指令查看對應(yīng)的匯編指令
javap -c ForEachTest.class
Compiled from "ForEachTest.java"
public class ForEachTest {
public ForEachTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void test4Iterate(java.lang.Iterable<java.lang.String>);
Code:
0: aload_1
1: invokeinterface #2, 1 // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
6: astore_2
7: aload_2
8: invokeinterface #3, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
13: ifeq 36
16: aload_2
17: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
22: checkcast #5 // class java/lang/String
25: astore_3
26: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
29: aload_3
30: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: goto 7
36: return
public void test4Array(java.lang.String[]);
Code:
0: aload_1
1: astore_2
2: aload_2
3: arraylength
4: istore_3
5: iconst_0
6: istore 4
8: iload 4
10: iload_3
11: if_icmpge 34
14: aload_2
15: iload 4
17: aaload
18: astore 5
20: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
23: aload 5
25: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
28: iinc 4, 1
31: goto 8
34: return
}
由反編類和匯編指令可以看到對于Iterable類,是通過其迭代方法執(zhí)行for each,而對于數(shù)組是通過傳統(tǒng)的for循環(huán)方式執(zhí)行迭代
因為集合類的for each是基于迭代器循環(huán)的,所以根據(jù)迭代器實現(xiàn)的不同,for each的性能也會不同
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vscode快速引入第三方j(luò)ar包發(fā)QQ郵件
這篇文章主要介紹了vscode快速引入第三方j(luò)ar包發(fā)QQ郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot+Vue+Redis實現(xiàn)單點登錄(一處登錄另一處退出登錄)
小編接到一個需求,需要實現(xiàn)用戶在瀏覽器登錄后,跳轉(zhuǎn)到其他頁面,當(dāng)用戶在其它地方又登錄時,前面用戶登錄的頁面退出登錄,這篇文章主要介紹了SpringBoot+Vue+Redis實現(xiàn)單點登錄,需要的朋友可以參考下2019-12-12
Http Cookie機制及Cookie的實現(xiàn)原理
Cookie是進(jìn)行網(wǎng)站用戶身份,實現(xiàn)服務(wù)端Session會話持久化的一種非常好方式。Cookie最早由Netscape公司開發(fā),現(xiàn)在由 IETF 的RFC 6265標(biāo)準(zhǔn)備對其規(guī)范,已被所有主流瀏覽器所支持2021-06-06
Java構(gòu)造函數(shù)里的一些坑記錄super()和this()
這篇文章主要介紹了Java構(gòu)造函數(shù)里的一些坑記錄super()和this(),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項
這篇文章主要給大家介紹了關(guān)于Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Cloud具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot + Mybatis Plus 整合 Redis的
文章詳細(xì)介紹了Redis在用戶管理系統(tǒng)中的應(yīng)用,包括用戶信息緩存、Token存儲、接口限流、重復(fù)提交攔截和熱點數(shù)據(jù)預(yù)加載等場景,并提供了具體的實現(xiàn)方案和步驟,感興趣的朋友一起看看吧2025-03-03
Docker 部署 SpringBoot 項目整合 Redis 鏡像做訪問計數(shù)示例代碼
這篇文章主要介紹了Docker 部署 SpringBoot 項目整合 Redis 鏡像做訪問計數(shù)Demo,本文給大家介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下2018-01-01

