forEach語句能否修改集合元素的值?


一. 先說結論

  1. forEach語句可以修改集合/數組元素爲對象的值,但不可以修改數組元素爲變量的值
  2. forEach語句不能在集合/數組中添加或刪除對象

二. 問題復現

1. 數組元素爲變量

  • 結論:當數組元素爲變量時,forEach循環不能修改原數據。如果想修改,只能通過正規for循環。
  1. forEach循環修改數組元素
public class VariableTest {
    public static void main(String[] args) {
        // 定義數組
        int[] variables = new int[]{1,2,3,4,5};

        // forEach循環遍歷數組
        for(int var:variables){
            if(var==3){
                var = 0;
            }
        }

        // 輸出數組結果
        for(int var:variables){
            System.out.println(var);
        }

    }
}
  • 輸出結果

1
2
3
4
5

  1. 正規for循環修改數組元素
public class VariableTest {
    public static void main(String[] args) {
        // 定義數組
        int[] variables = new int[]{1,2,3,4,5};

        // 正規for循環遍歷數組
        for(int i=0;i<variables.length;i++){
            if(variables[i]==3){
                variables[i] = 0;
            }
        }

        // 輸出數組結果
        for(int var:variables){
            System.out.println(var);
        }

    }
  • 輸出結果

1
2
0
4
5

2. 集合/數組元素爲對象

  • 結論:當數組元素爲對象時,forEach循環可以修改原數據。
  1. forEach循環修改集合元素
public class ObjectTest {
    public static void main(String[] args) {
        List<Emp> empList = Lists.newArrayList();
        empList.add(new Emp("123","李華",12));
        empList.add(new Emp("456","王五",18));
        empList.add(new Emp("789","大師",16));

        // forEach遍歷集合
        for(Emp emp:empList){
            if(emp.getName().equals("大師")){
                emp.setAddress("000");
            }
        }

        // 輸出數組結果
        for(Emp emp:empList){
            System.out.println(emp.getAddress()+","+emp.getName()+","+emp.getAge());
        }

    }
}

public class Emp {
    private String address;
    private String name;
    private Integer age;

    //getter and setter方法
}
  • 輸出結果

    123,李華,12
    456,王五,18
    000,大師,16


三. 賦值測試

  • 目的:爲了瞭解上述問題的精髓,對變量和對象進行了賦值測試。
  • 結論:對象和變量不一樣。變量是獨立的;對於對象,如果你把一個對象傳給另一個對象,它們就是同一個對象,修改其中一個另一個就會修改!

1. 賦值測試·變量賦值

public class VariableAssignmentTest {
    public static void main(String[] args) {
        int a = 1;
        int b = a;
        b = 2;
        System.out.println(a); // 1
    }
}
  • 說明:變量賦值後,修改變量b不會改變原變量a

2. 賦值測試·對象賦值

public class ObjectAssignmentTest {
    public static void main(String[] args) {
        Emp emp = new Emp("123","李華",12);
        Emp temp = emp;
        temp.setAge(100);
        System.out.println(emp); // Emp{address='123', name='李華', age=100}
    }
}
  • 說明:對象賦值,賦的是引用(即原對象所在的地址)

參考資料

Java中用foreach遍歷真的不能修改數據?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章