首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用引用替换项的Java foreach将无法工作

使用引用替换项的Java foreach将无法工作
EN

Stack Overflow用户
提问于 2013-07-25 10:12:20
回答 2查看 214关注 0票数 0

在练习中,我们必须在循环中用另一个对象替换对象。我的解决方案是使用"ListIterator“。但是一位同事尝试使用foreach语法并播放引用,但是这个解决方案无法工作。

代码语言:javascript
复制
// This doesn't work
for ( Growable growable : growables ) {
  growable = growable.grow(); // Return another object (seed -> sprout, ..)
}

// But that well
for (final ListIterator<Growable> it = growables.listIterator(); it.hasNext();) {
  it.set(it.next().grow());
}

从documentation1中,我可以看到,foreach不适合替换,因为我们没有对迭代器的引用。

为了删除当前元素,程序需要访问迭代器。for-each循环隐藏迭代器,因此不能调用remove。因此,for-each循环不能用于过滤.类似地,在循环中,当您遍历列表或数组时需要替换元素时,它是不可用的。

但是我们有一个对迭代对象的引用。我错了吗?有人能解释一下为什么"foreach“解决方案不起作用吗?

谢谢

1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-25 10:16:49

在第一个片段中,您从growables获取一个元素并将其分配给growable。这意味着变量growable引用该元素。

如果重新分配growable,它将开始引用另一个对象。但这并不会改变growables中的对象。

为了了解发生了什么,您可以将其与数组进行比较。使用foreach语法:

代码语言:javascript
复制
int[] array = {1, 2, 3};
for (int x : array) {
    x = 0;
}
System.out.println(array[0]);

这将打印1。原因是这个片段相当于

代码语言:javascript
复制
int[] array = {1, 2, 3};
for (int i = 0; i < array.length; i++) {
    int x = array[i];
    x = 0;
}
System.out.println(array[0]);

现在更明显的是,分配给x并不会修改array

票数 0
EN

Stack Overflow用户

发布于 2013-07-25 10:18:28

在foreach情况下,只为growable分配了一个值,该值将在下一步中被遗忘,因为新的迭代将发生,growable的值将被增长的下一个元素覆盖。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17855078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档