Java中用foreach遍歷真的不能修改資料?
問題:
foreach語句到底可不可以改變所遍歷容器(陣列與集合)的值?
我先說個答案:可以改變物件的值,但是不能刪除或新增物件,也不可以改變變數(比如int a)的值,就算用集合存變數依舊不能。
概述:
我在書上看到的是這句話:當需要以其他順序遍歷陣列或改變陣列中的元素時,還是必須使用下標變數。
它僅僅表示的陣列中不可以改變,我測試了一下,確實如此:
程式碼表示:
import java.util.*; //導包 public class Test1 { public static void main(String[] args) { int [] a=new int [] {1,2,3,4,5,6,7,8}; //定義陣列 for(int b:a) //foreach遍歷陣列a { if(b==3) //如果找到b=3 { b=4; //把b改成4 } } System.out.println("---------輸出陣列"); for(int b:a) //再次遍歷陣列a,看看改變有沒有影響a { System.out.println(b); //輸出a中的全部值 } } }
輸出結果:
---------輸出陣列
1
2
3
4
5
6
7
8
很明顯啊,我改的b變成4的,沒變啊!!!說明b的改變不影響a的。那麼大家看下我下面的例子程式碼:
public class Test_1 {
public static void main(String[] args) {
int a=1;
int b=a;
b=2;
System.out.println("a="+a);
}
}
嘿嘿哈哈,a只是把值給了b,a和b是兩個變數,所以b的改變不關於a。
輸出結果:
a=1
那麼再回頭來看看之前的程式碼,在foreach迴圈中,就是把容器中的資料交給了那個element,一個道理,當容器裝的是變數的時候,foreach迴圈是改變不了原資料的,想改變只能通過正規for迴圈:
for(int i=0;i<a.length;i++)
{
if(a[i]==3)
a[i]=4;
}
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
奈斯啊,忽然發現正規的for迴圈還是有用的啊!但是呢,在遍歷的不是變數容器,而是物件容器的時候.........
程式碼表示:
import java.util.*; //導包 public class Test1 { public static void main(String[] args) { ArrayList <Clerk> al=new ArrayList<>(); //建立Clerk型別的ArrayList al.add(new Clerk("周衛國",30,5000)); //新增幾個Clerk型別物件 al.add(new Clerk("李雲龍",30,5000)); al.add(new Clerk("諸葛亮",30,5000)); al.add(new Clerk("張小凡",30,5000)); al.add(new Clerk("泛型",30,5000)); al.add(new Clerk("集合",30,5000)); System.out.println("---------遍歷集合"); for(Clerk x:al) //foreach遍歷集合 { if(x.getName().equals("李雲龍")) //如果找到名字等於李雲龍的物件 { x.setSalary(10000); //修改物件的薪資 } } System.out.println("---------輸出集合"); for(Clerk x:al) //foreach遍歷 { System.out.println(x.getName()+" "+x.getAge()+" "+x.getSalary()); //輸出資訊 } } } class Clerk //定義員工類 { private String name; private int age; private double salary; Clerk(String name,int age,double salary) { this.name=name; this.age=age; this.salary=salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
你們還覺得那個x和物件本身沒關係嗎?哈哈??我確實是這麼認為的,後來我發現.......我
輸出結果:
---------遍歷集合
---------輸出集合
周衛國 30 5000.0
李雲龍 30 10000.0
諸葛亮 30 5000.0
張小凡 30 5000.0
泛型 30 5000.0
集合 30 5000.0
這就尷尬了,李雲龍的薪資竟然變了!!!麻麻,這不是去幼兒園的車........套路啊,說好的x是儲存資料,不會關於原資料啊!
於是我問了各路大神,最後詢問學姐求助,學姐告訴我:物件和變數不一樣,變數是獨立的,但是如果你把物件傳給另一個物件,他們就是一個物件了,這個改了那個就改了!!
巨為尷尬的我測試一下把一個物件賦給臨時物件:
public class Test_1 {
public static void main(String[] args) {
Clerk c1=new Clerk("周華劍",30,5000); //建立一個員工
Clerk temp=c1; //把c1交給temp
temp.setSalary(10000); //改變temp的薪資
System.out.println(c1.getSalary()); //輸出c1的薪資
}
}
class Clerk //定義員工類
{
private String name;
private int age;
private double salary;
Clerk(String name,int age,double salary)
{
this.name=name;
this.age=age;
this.salary=salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
輸出結果:
c1的薪資:10000.0
啊嘞?還真的是哎,後來我查資料發現,物件的賦值,賦的是引用,即給的是原物件所在的地址,牽一髮而動全身。
總結:
foreach迴圈不可以改變變數的值,但是可以用它去改變物件的值。
歡迎各位在評論區留言討論~~
相關推薦
Java中用foreach遍歷真的不能修改資料?
問題:foreach語句到底可不可以改變所遍歷容器(陣列與集合)的值?我先說個答案:可以改變物件的值,但是不能刪除或新增物件,也不可以改變變數(比如int a)的值,就算用集合存變數依舊不能。概述:我在書上看到的是這句話:當需要以其他順序遍歷陣列或改變陣列中的元素時,還是必須
JAVA io流筆記02 操作目錄,遍歷檔案,資料夾
package FileText; import java.io.File; //操作目錄 //mkdir() 建立目錄,必須保證父目錄存在,如果父目錄不存在,建立失敗 //mkdirs() 建立目錄,如果父目錄不存在,直接建立父目錄 //list() 輸出當前路徑下檔名 //listFil
java中迴圈遍歷實體類的屬性和資料型別以及屬性值
package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;
Java 中list(ArrayList)的foreach遍歷方式呼叫list的remove刪除元素,不丟擲ConcurrentModificationException
關於list刪除元素的當時有很多,具體可以參考下面這個部落格。 https://blog.csdn.net/claram/article/details/53410175 裡面提到了list的foreach遍歷方式刪除元素,會丟擲ConcurrentMo
java 8中forEach遍歷
public class ForEachTest { public static void main(String[] args) { /** list */ //Array
Java中使用foreach遍歷list的盲點,
我們通常在專案中會用到ArrayList ,喜歡使用jdk1.5以後的foreach進行對list集合遍歷,但是以下的操作會遇到小坑請看程式碼:public class TestListUtils {
java遍歷磁碟或資料夾
package com.hcj.july22.am; import java.io.File; public class C_File { File f ; public C_File(File f) { super(); this.f = f; } p
使用c標籤的forEach遍歷展現資料庫主表與從表的資料
首先,資料庫有兩個表,A表的ID(主鍵)是B表的外來鍵,A表的一條資料可能對應B表的一條或多條資料,即A1→ B1、B2、B3... 功能需求是將A表的資料與A表對應的B表的資料顯示出來,這就需要用到C標籤,並且這裡需要C標籤的套用。 後臺通過Map將值傳到前臺,後臺程式碼
Java基礎之你會在foreach遍歷集合時進行remove操作嗎?
當通過for迴圈遍歷集合時,一般禁止操作(add or remove)集合元素。雖然開發規範裡寫的非常清楚,但最近還是有人掉坑裡導致出了一個小BUG,那我們就一起看看這麼做到底會發生什麼? 小例子 程式碼示例 List<String>
java中的foreach遍歷
//foreach 遍歷一維陣列 String[] names = {"beijing","shanghai"}; for (String name : names){System.out.println(name); }//foreach 遍歷二維陣列 String[][
遍歷出來的資料實現對應的修改
樣式: 要實現的功能:(1):點選修改可以使對應的輸入框變為可以編輯,同時把 ‘修改’ => ‘確定’ 程式碼 : vue-html <div class="home"> <ul> <
關於java的一個簡單二維陣列foreach遍歷問題
問題:foreach遍歷一個二維陣列,到底是如何遍歷的呢? 這與陣列在棧堆中的記憶體位置有關係,貼圖: 首先int[][] arr 壓棧,然後在堆記憶體中分配一個二維陣列的地址,引用給arr宣告,注意,這裡的地址其實是一個一維陣列,一維陣列中存放的都是地址值,然後遍歷
java裡面在遍歷集合的時候對集合進行新增或者刪除修改時的併發修改異常
在今天看視訊的時候講到修改集合元素的時候會出現併發修改異常 就是像這樣 ArrayList<Integer> list = new ArrayList<>(); list
java foreach遍歷順序
在java中,我們經常使用foreach(官方說法:The enhanced for statement)的形式來遍歷Collection和Array,那麼遍歷的順序是怎麼樣的呢? 一般,我們使用如下的形式來使用foreach的功能: for(var x
Java循環遍歷中直接修改遍歷對象
span spa ++ source i++ add ren rem color Java 循環遍歷中直接修改遍歷對象如下,會報異常: for (ShopBaseInfo sp: sourceList) { if(sp.getId()==5)
foreach遍歷 < 創建表 >練習題
html idt 蘋果 col spa 葡萄 效果圖 source array 1 </head> 2 3 <body> 4 <table border="1" width="500" height="300"/> 5 &
可以使用foreach遍歷循環的條件
log 接口 logs 處理 語句 買衣服 foreach遍歷 程序 tle 大話C#中能使用foreach的集合的實現 轉自:http://www.cnblogs.com/tangzhengyue/p/3339936.html 大家都知道foreach的語法: f
JAVA按層級遍歷二叉樹
blog otn 二叉 all this java algorithm set com /** * @author cj 2017年7月14日下午1:14:31 */ package com.yuanye.algorithm; import java.util.Li
Java實現深度遍歷和廣度遍歷數及其應用
fss blog nac emd fan 深度遍歷 apu soc use dc9mr6賦炮炮窖屠韌http://docstore.docin.com/hhmg5158wbx7ax睪躍茁胤駁諭http://shufang.docin.com/sina_6372926856g
Java8新特性之forEach遍歷
clas 分享圖片 pos 分享 inf div post for AC 參考文章: https://www.cnblogs.com/billyu/p/6118008.htmlJava8新特性之forEach遍歷