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变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。
我自己也试了一下,是有一个副本的代码如下:
反编译代码如下:
以上这篇浅谈foreach写失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。