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遍历真的不能修改数据?

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值