首页 > 编程 > Java > 正文

浅谈foreach写失效的问题

2019-11-26 11:46:10
字体:
来源:转载
供稿:网友

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写失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表