浅谈foreach写失效的问题
Java中的细节一定要清楚,否则非常容易出现问题。例如这个场景:遍历一个集合,对符合某种条件的元素做修改。大家往往会写出如下代码:
public class JavaTest
{
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for (Integer temp : list)
{
if (temp == 1)
{
temp = temp * 2;
}
}
for (Integer a : list)
{
System.out.println(a);
}
}
}
期待的结果是:
2
2
3
但实际输出为:
1
2
3
这是很容易掉进去的陷阱。即通过foreach遍历对集合元素进行修改。在以为变更已发生的时候,其实变更没有发生。造成数据写入失败。因为
for (Integer temp : list)
{
if (temp == 1)
{
temp = temp * 2;
}
}
根据oracle的官方文档,正式翻译应该如下
for (Iterator i = list.iterator(); i.hasNext(); )
{
float i0 = (Integer)i.next();
if(i0 == 1)
i0 = i0*2;
}
即:foreach里头的的 temp变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。
我自己也试了一下,是有一个副本的代码如下:

反编译代码如下:

以上这篇浅谈foreach写失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
一文搞懂spring boot本地事务@Transactional参数
这篇文章主要介绍了spring boot本地事务@Transactional参数详解,本文通过示例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-10-10
SpringBoot整合Mybatis实现多数据源配置与跨数据源事务实例
开发中经常有这样的需要: 读写分离。微服务环境下可以实现一个服务读取一个数据库,另一个服务写库。但是在实际应用中有时也需要在一个服务中读写不同的数据库。可以在一个SpringBoot单体项目中配置多个数据源解决读写库分离2022-11-11
Spring Boot Maven Plugin打包异常解决方案
这篇文章主要介绍了Spring Boot Maven Plugin打包异常解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-11-11


最新评论