Java forEach對(duì)原數(shù)組的操作過程
forEach
總結(jié)
forEach對(duì)于基本數(shù)據(jù)類型,是直接賦值,對(duì)于引用數(shù)據(jù)類型,是引用地址值。
- 對(duì)于基本數(shù)據(jù)類型,forEach不能修改原數(shù)組的值。
- .對(duì)于引用數(shù)據(jù)類型:String,forEach也不能修改原數(shù)組的值,因?yàn)镾tring是不可變的。
- 對(duì)于其他引用類型(不被final修飾),forEach能修改具體的屬性,因?yàn)閒orEach是地址引用。
forEach遍歷時(shí),是創(chuàng)建的臨時(shí)變量,引用的數(shù)據(jù)地址。
對(duì)于基本數(shù)據(jù)類型,int,char,double等,這些值在forEach中進(jìn)行遍歷操作時(shí),是不能修改的。
@Test public void testInt(){ int[] arr = new int[]{1,2,3,4,5}; //使用foreach遍歷arr數(shù)組 for(int i : arr){ //如果i=2,那么就將i值變?yōu)? if(i == 2){ i = 0; } } //遍歷數(shù)組 for(int i : arr){ System.out.print(i + " "); }
對(duì)于以上代碼,我們預(yù)期輸出是1 0 3 4 5,但是實(shí)際輸出是1 2 3 4 5
forEach在遍歷基本數(shù)據(jù)類型是,相當(dāng)于是創(chuàng)建了一個(gè)臨時(shí)變量i,我們相對(duì)數(shù)組元素的修改,實(shí)際上都是修改的i值,并不會(huì)影響原數(shù)據(jù)
對(duì)于引用數(shù)據(jù)類型:
特殊:String類:
對(duì)于String類,也是不能修改的,因?yàn)镾tring是被final修飾,是不可變的。
@Test public void testString(){ String[] strAll = new String[]{"aa","bb","cc"}; for(String str : strAll){ if("bb".equals(str)){ str = "xx"; } } for(String str : strAll){ System.out.print(str + " "); } }
對(duì)于以上代碼,我們預(yù)期輸出是 aa xx cc ,但是實(shí)際輸出確實(shí) aa bb cc
開始時(shí)內(nèi)存空間解析:
后面str依次指向aa bb cc
當(dāng)指向bb時(shí),他想修改其中的值,但是String是不能被修改的,所以他只能重新去創(chuàng)建一個(gè)1,但是原數(shù)組的指向并沒變。,所以最后遍歷踹的原數(shù)組值也是不會(huì)改變的。
對(duì)于其他引用類:
例如StringBuilder:
需要注意的是,StringBuilder并沒有重寫equals()方法,所以在進(jìn)行equals比較時(shí),只能轉(zhuǎn)化成String來(lái)比較。
@Test public void testStringBuilder(){ StringBuilder[] strBul = new StringBuilder[]{new StringBuilder("111"), new StringBuilder("222"), new StringBuilder("333")}; for(StringBuilder s : strBul){ //StringBuilder并沒有重寫equals,所以如果直接調(diào)用的話,它是比較的地址值。 if("222".equals(s.toString())){ s.append("aaa"); } } for(StringBuilder s : strBul){ System.out.println(s); }
預(yù)期輸出和實(shí)際輸出都是 111 222aaa 333
我們自己定義的類:
public class TestForeach { Person[] pArr = new Person[]{new Person("張三",18),new Person("李四",20),new Person("王六",10)}; public void foreachTestPerson(){ for(Person p : pArr){ if("王六".equals(p.name)){ p.age = 100; } } for(Person p : pArr){ System.out.println(p); } } public static void main(String[] args) { new TestForeach().foreachTestPerson(); } } class Person{ public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", id=" + age + '}'; } }
特別需要注意:StringBuilder和StringBuffer都是沒有重寫equals()方法的,不要直接用equals比較!
內(nèi)存解析:
開始時(shí):
修改后,原數(shù)組的地址時(shí)沒有變的,所以能修改成功。
到此這篇關(guān)于Java forEach對(duì)原數(shù)組的操作過程的文章就介紹到這了,更多相關(guān)java foreach數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot2.1 RESTful API項(xiàng)目腳手架(種子)項(xiàng)目
這篇文章主要介紹了SpringBoot2.1 RESTful API項(xiàng)目腳手架(種子)項(xiàng)目,用于搭建RESTful API工程的腳手架,只需三分鐘你就可以開始編寫業(yè)務(wù)代碼,不再煩惱于構(gòu)建項(xiàng)目與風(fēng)格統(tǒng)一,感興趣的小伙伴們可以參考一下2018-12-12教你通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引
大家都知道B+Tree是從二叉樹演化而來(lái),在這之前我們來(lái)先了解二叉樹、平衡二叉樹、平衡多叉樹,這篇文章主要介紹了通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下2022-01-01SpringBoot基于redis自定義注解實(shí)現(xiàn)后端接口防重復(fù)提交校驗(yàn)
本文主要介紹了SpringBoot基于redis自定義注解實(shí)現(xiàn)后端接口防重復(fù)提交校驗(yàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01spring.profiles.active配置使用小結(jié)
spring.profiles.active?配置使得應(yīng)用程序能夠在不同的環(huán)境中使用不同的配置,本文主要介紹了spring.profiles.active配置使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07Java實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)知識(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11SpringAop @Around執(zhí)行兩次的原因及解決
這篇文章主要介紹了SpringAop @Around執(zhí)行兩次的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java實(shí)現(xiàn)把圖片處理到指定大小的操作方法
項(xiàng)目開發(fā)中,經(jīng)常遇到圖片上傳功能,發(fā)現(xiàn)如果圖片比較大時(shí),在查看、預(yù)覽、下載速度會(huì)特別慢,考慮到浪費(fèi)流量以及文件服務(wù)器的存儲(chǔ)空間,決定在后端優(yōu)化處理完再上傳,所以本文給大家介紹了使用Java把圖片處理到指定大小的操作方法,需要的朋友可以參考下2025-03-03mybatis-plus @select動(dòng)態(tài)查詢方式
這篇文章主要介紹了mybatis-plus @select動(dòng)態(tài)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05