1. 程式人生 > >Java中用foreach遍歷真的不能修改資料?

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中使用foreachlist的盲點,

我們通常在專案中會用到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遍歷