Java——Java中用foreach遍历真的不能修改数据?

Java——Java中用foreach遍历真的不能修改数据?问题 foreach 语句到底可不可以改变所遍历容器 数组与集合 的值 我先说个答案 可以改变对象的值 但是不能删除或添加对象 也不可以改变变量 比如 inta 的值 就算用集合存变量依旧不能 概述 我在书上看到的是这句话 当需要以其他顺序遍历数组或改变数组中的元素时 还是必须使用下标变量 它仅仅表示的数组中不可以改变 我测试了一下 确实如此 代码表示 importj

问题:

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 
  

奈斯啊,忽然发现正规的for循环还是有用的啊!

但是呢,在遍历的不是变量容器,而是对象容器的时候………

代码表示:

import java.util.*; //导包 public class Test1 { public static void main(String[] args) { ArrayList 
  
    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循环不可以改变变量的值,但是可以用它去改变对象的值。

欢迎各位在评论区留言讨论~~

觉得有用的话,点个赞和关注吧,博主会坚持写更实用易懂的博文

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217754.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:50
下一篇 2026年3月18日 上午8:50


相关推荐

  • 张予彤入主月之暗面,kimi该去哪“爆金币”?

    张予彤入主月之暗面,kimi该去哪“爆金币”?

    2026年3月12日
    2
  • 5分钟搞定!最全Dokploy部署n8n教程

    5分钟搞定!最全Dokploy部署n8n教程

    2026年3月15日
    2
  • 申请软件著作权步骤[通俗易懂]

    申请软件著作权步骤[通俗易懂]前言:申请软件著作权对格式要求很严格,材料一定要保证格式正确,一般来说需要参考模板。另外,邮寄材料到版权中心的方式比较慢,而且万一材料格式或者内容不合适的话补正的话很麻烦,最好还是到现场办理成功率高。就我的经验来说,材料出现的错误率最高的是:1>要求签章的地方未按要求进行签章;2>材料提供的不全;3>材料内容不恰当,需要更改,比如浏览器需要加上安装卸载过程、微信小程序需要体现是在…

    2022年6月24日
    25
  • apache2虚拟主机实现一个服务器绑定多个域名[通俗易懂]

    apache2虚拟主机实现一个服务器绑定多个域名[通俗易懂]1.apache2的配置首先要配置好apache2,如果未配置,请参考我之前的博文:lamp的配置2.域名的解析将全部域名的www和@的A记录解析到云服务器的IP3.虚拟主机的配置1.配置httpd.conf如果etc/httpd/conf/httpd.conf存在,则配置此httpd.conf如果etc/httpd/conf/httpd.conf不存在,此时需要我们在/etc/apache2下

    2026年1月17日
    5
  • GPT分区安装Win7/Win10教程

    GPT分区安装Win7/Win10教程

    2026年3月16日
    2
  • Python中的取整、取余运算「建议收藏」

    Python中的取整、取余运算「建议收藏」1.取整运算在Python中取整运算的运算符为//,且取整运算的取整为向下取整,不进行四舍五入例:9//4=2,即9对4取整等于2-9//-4=2,因为-9÷-4=2.25,取整为2那么问题来了,9//-4等于多少呢?9//-4=-3,因为9÷-4应该等于-2.25,那么对-2.25向下取整,应该为-3,而不是-2,所以9//-4=-3那么-9//4呢?-9÷4也应该等于-2.25,所以向下取整,得到-9//4=-3总结:9//4=2-9//-4=29//-4=-3-9//4=-3

    2022年5月18日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号