【问题标题】:Which is the best way to iterate over a non-generic List? [closed]迭代非泛型列表的最佳方法是什么? [关闭]
【发布时间】:2011-11-18 17:49:09
【问题描述】:

我必须使用一段旧代码,其中我有一个 List 并且我需要对其进行迭代。 Foreach 循环不起作用。哪种方法最好、最安全?

例子

private void process(List objects) {
    someloop {
        //do something with list item
        //lets assume objects in the List are instances of Content class
    }           
}

【问题讨论】:

  • 为什么 for-each 循环不起作用?
  • 你的意思是你需要从列表中删除元素,还是做一些其他的事情来阻止 for-each 的使用?请澄清。
  • 我正在尝试使用 Content 类(不是 Object)的 foreach 循环,这就是它不起作用的原因。我的错误,我没有意识到这一点。谢谢
  • Foreach 循环不起作用是什么意思?这似乎是低质量问题标志的候选者。
  • 所以...首先你说 foreach 循环不起作用,不要解释你的意思,然后接受使用 foreach 循环的答案。这必须是低质量问题的教科书定义。

标签: java loops iteration raw-types


【解决方案1】:

使用Iterator:

Iterator iter = objects.iterator();
while (iter.hasNext()) {
    Object element = iter.next();
}

或者直接for-each更好:

for (Object obj : objects) {
}

【讨论】:

  • interator 是否比简单的 for() 循环更有效?
  • 没有区别。 for-each 在里面使用迭代器。
【解决方案2】:

如果您需要能够从列表中删除当前元素,请使用迭代器:

for (Iterator it = list.iterator(); it.hasNext();) {
    Foo foo = (Foo) it.next();
    // ...
    it.remove();
}

或者使用foreach循环:

for (Object o : list) {
    Foo foo = (Foo) o;
    // ...
}

【讨论】:

  • 已修复。谢谢你。我更喜欢使用 for 循环,因为它将迭代器的范围缩小到循环。
  • 为什么要使用 it.remove() ?这是否会导致某些列表实现出现并发访问异常?
  • 这只是为了说明为什么可能需要迭代器:从集合中删除元素同时迭代它只能使用迭代器。使用 foreach 循环是不可能的,使用迭代器是避免 ConcurrentModificationException 的唯一方法。如果不需要 remove,则 foreach 循环更简单、更短。
  • @James DW - 使用迭代器时,您可以根据需要删除元素。当使用 for-each 循环时,你不能。
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2019-07-24
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多