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