关于foreach循环不能修改变量的值问题

您所在的位置:网站首页 jqueryfor循环 关于foreach循环不能修改变量的值问题

关于foreach循环不能修改变量的值问题

2023-12-31 03:18| 来源: 网络整理| 查看: 265

关于foreach循环不能修改变量的值问题 一、发现问题二、探究原因三、验证四、总结

一、发现问题

直接上代码

List[] lists = new ArrayList[5]; for (List list : lists){ list = new ArrayList(); } for (List list : lists){ System.out.println(list); }

观察这段简单的代码,首先创建了一个ArrayList的数组,然后通过foreach循环对该数组进行赋值,随后打印该数组。

预期将会打印出 5 行list的toString()信息,但是,实际情况却有所不一样。

运行结果:

null null null null null Process finished with exit code 0

为什么会出现这样的情况?不是赋值了嘛?

既然这样,难道是我赋值的姿势不正确?要不我换一种方式,直接用for进行赋值

List[] lists = new ArrayList[5]; for (int i=0;i System.out.println(list); }

运行结果如下:

[] [] [] [] [] Process finished with exit code 0

这次成功赋值了,对比之下,我们大概可以猜到是因为使用了foreach而导致赋值失败的。

二、探究原因

首先得分析JDK源码,foreach基于容器或者数组的迭代器,也就是Iterator实现的,在翻阅源码的过程中,发现迭代器有一个方法forEach.

public void forEach(Consumer action) { Objects.requireNonNull(action); int expectedModCount = this.modCount; Object[] es = this.elementData; int size = this.size; for(int i = 0; this.modCount == expectedModCount && i throw new ConcurrentModificationException(); } }

该方法正是实现foreach的关键,可以看出,增强型循环将数组或者容器传入方法体,方法体再执行操作,而这个过程就涉及到了 JAVA参数是值传递 的问题,如果不理解,可以参考这篇文章,有比较详细的介绍。

链接: 如何理解Java是值传递?.

也就是说,对foreach的操作其实是对数组或者容器的拷贝的操作。 在这里插入图片描述 所以对原来数据的值(基本数据类型、引用)将不会发生改变,但可以修改引用的属性。

三、验证

下面将进行对foreach修改引用的属性的测试:

List[] lists = new ArrayList[5]; for (int i=0;i list.add(1); } for (List list : lists){ System.out.println(list); }

首先创建数组,并且赋值,然后通过foreach修改数组的内容,最后打印

运行结果如下:

[1] [1] [1] [1] [1] Process finished with exit code 0

验证成功!

四、总结

1.foreach的实现基于Iterator; 2.不能使用foreach对数组或容器进行赋值; 3.可以使用foreach修改数组或容器的对象的属性; 4.赋值行为尽量使用for循环。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3