关于foreach循环不能修改变量的值问题 |
您所在的位置:网站首页 › jqueryfor循环 › 关于foreach循环不能修改变量的值问题 |
关于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 |