浅谈foreach写失效的问题

Java中的细节一定要清楚,否则非常容易出现问题。例如这个场景:遍历一个集合,对符合某种条件的元素做修改。大家往往会写出如下代码:

我们提供的服务有:成都网站建设、网站设计、微信公众号开发、网站优化、网站认证、镇安ssl等。为1000多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的镇安网站制作公司

public class JavaTest
{
 public static void main(String[] args)
 {
  ArrayList list = new ArrayList();
  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写失效的问题

反编译代码如下:

浅谈foreach写失效的问题

以上这篇浅谈foreach写失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持创新互联。


本文题目:浅谈foreach写失效的问题
标题网址:http://bzwzjz.com/article/jjdiho.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都网站建设公司 成都商城网站制作 企业网站设计 移动手机网站制作 成都企业网站建设公司 重庆网站建设 重庆网站制作 成都企业网站建设 宜宾网站设计 网站制作 营销网站建设 阿坝网站设计 H5网站制作 网站制作公司 网站制作报价 成都网站设计公司 定制网站建设 成都网站建设 成都定制网站建设 网站建设 网站设计公司 成都网站建设