打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Stream流
Java进阶 之 Stream流
JSTL标签库_c:if标签
全部折叠显示
C# Array 类 | 菜鸟教程
Stream的创建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服