分享

foreach写失效的问题 – 金丝燕网

 JerryJade 2015-12-21

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写失效的问题

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约