栏目:Java8基础 作者:admin 日期:2015-10-30 评论:2 点击: 4,709 次
Java中的细节一定要清楚,否则非常容易出现问题。例如这个场景:遍历一个集合,对符合某种条件的元素做修改。大家往往会写出如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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遍历对集合元素进行修改。在以为变更已发生的时候,其实变更没有发生。造成数据写入失败。因为
1 2 3 4 5 6 7 |
for (Integer temp : list) { if (temp == 1) { temp = temp * 2; } } |
根据oracle的官方文档,正式翻译应该如下
1 2 3 4 5 6 |
for (Iterator i = list.iterator(); i.hasNext(); ) { float i0 = (Integer)i.next(); if(i0 == 1) i0 = i0*2; } |
即:foreach里头的的 temp变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。
------====== 本站公告 ======------
金丝燕网,一个严谨的网站!