Java forEach對原數(shù)組的操作過程
forEach
總結(jié)
forEach對于基本數(shù)據(jù)類型,是直接賦值,對于引用數(shù)據(jù)類型,是引用地址值。
- 對于基本數(shù)據(jù)類型,forEach不能修改原數(shù)組的值。
- .對于引用數(shù)據(jù)類型:String,forEach也不能修改原數(shù)組的值,因為String是不可變的。
- 對于其他引用類型(不被final修飾),forEach能修改具體的屬性,因為forEach是地址引用。
forEach遍歷時,是創(chuàng)建的臨時變量,引用的數(shù)據(jù)地址。
對于基本數(shù)據(jù)類型,int,char,double等,這些值在forEach中進行遍歷操作時,是不能修改的。
@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 + " ");
}對于以上代碼,我們預(yù)期輸出是1 0 3 4 5,但是實際輸出是1 2 3 4 5

forEach在遍歷基本數(shù)據(jù)類型是,相當(dāng)于是創(chuàng)建了一個臨時變量i,我們相對數(shù)組元素的修改,實際上都是修改的i值,并不會影響原數(shù)據(jù)
對于引用數(shù)據(jù)類型:
特殊:String類:
對于String類,也是不能修改的,因為String是被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 + " ");
}
}對于以上代碼,我們預(yù)期輸出是 aa xx cc ,但是實際輸出確實 aa bb cc

開始時內(nèi)存空間解析:

后面str依次指向aa bb cc

當(dāng)指向bb時,他想修改其中的值,但是String是不能被修改的,所以他只能重新去創(chuàng)建一個1,但是原數(shù)組的指向并沒變。,所以最后遍歷踹的原數(shù)組值也是不會改變的。

對于其他引用類:
例如StringBuilder:
需要注意的是,StringBuilder并沒有重寫equals()方法,所以在進行equals比較時,只能轉(zhuǎn)化成String來比較。
@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ù)期輸出和實際輸出都是 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ù)組的地址時沒有變的,所以能修改成功。

到此這篇關(guān)于Java forEach對原數(shù)組的操作過程的文章就介紹到這了,更多相關(guān)java foreach數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot異常處理try-catch應(yīng)該怎么使用?
這篇文章詳細(xì)介紹了Web系統(tǒng)中異常處理的重要性,以及SpringMVC的異常處理機制,解釋了異常在系統(tǒng)中的角色,討論了Java異常模型的關(guān)鍵認(rèn)知,包括Throwable體系結(jié)構(gòu)和異常傳播,強調(diào)了在Web系統(tǒng)中不應(yīng)該到處使用try-catch,而是應(yīng)該在邊界層統(tǒng)一處理異常2026-01-01
Spring Cloud Config配置文件使用對稱加密的方法
Spring Cloud Config提供了兩種加密解密方式,一種是對稱加密,一種是非對稱加密。這篇文章將先展示如何使用對稱加密。感興趣的朋友跟隨腳步之家小編一起學(xué)習(xí)吧2018-05-05
LangChain4j 集成 SpringBoot的項目實踐
本文主要介紹了LangChain4j 集成 SpringBoot的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-12-12

