在Java循环期间列表对象引用已更改

时间:2015-02-24 21:01:37

标签: java loops iterator

我找不到任何关于此的话题。我想知道在循环过程中是否可以安全地更改列表类的引用:

Tree minimalTree = someTree;
for (Tree st : minimalTree.getSubtrees()) {
  if (condition)
    minimalTree = st;
}

迭代器是否会重置并重新启动新引用?

编辑:我忘了说:这段代码适用于我想缩小搜索树中元素的情况,比方说,包含某些元素的小树。在这种情况下,继续只查看“minimalTree”的内部结构而不是整个“someTree”结构会更快。

2 个答案:

答案 0 :(得分:6)

不,迭代不会被重置。根据{{​​3}}:

  

增强的for语句相当于一个基本的for语句   形式:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
     {VariableModifier} TargetType Identifier = (TargetType) #i.next();
     Statement
}

该定义很明显迭代器只在循环的第一次迭代之前初始化一次。

在这方面,使用增强的for语句迭代数组时的行为类似。

但我个人认为这种做法很差,因为它使代码难以理解。

答案 1 :(得分:2)

实际上,有两个问题:

  

我想知道在循环过程中是否可以安全地更改列表类的引用:

是的,这是安全的。为安全起见,我的意思是:更改引用不会干扰已经运行的循环。

  

迭代器是否会重置并重新启动新引用?

不,迭代器永远不会重置。这与安全完全相反。

在我看来,在循环中更改迭代器或集合变量不是一个好习惯。它使代码更难理解,并且可能结果不是你所期望的那样(就像在你的情况下我理解你期望循环开始重新评估集合)。

在您的情况下,封装在方法中并在子树上递归调用它:

Tree findMinimalTree(Tree tree) {
   for (Tree st : tree.getSubtrees()) {
     if (condition)
       return findMinimalTree(st);
   }
   return tree;
}