源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅谈foreach写失效的问题

  • 时间:2021-09-15 14:16 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅谈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);
  }
 }
}
[b]期待的结果是:[/b] 2 2 3 [b]但实际输出为:[/b] 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变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。 我自己也试了一下,是有一个副本的代码如下: [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100119_0_63024.png[/img] 反编译代码如下: [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100120_1_55089.png[/img] 以上这篇浅谈foreach写失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部