For-each vs Iterator.哪个是更好的选择

Ruc*_*era 45 java foreach iterator

请考虑以下情形.

List<String> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

现在我添加了String此列表的值.

我使用以下方法来查看列表中的每个元素.

选项一 - 使用 for-each

for (String i : list) {
        System.out.println(i);
    } 
Run Code Online (Sandbox Code Playgroud)

选项二 - 使用 Iterator

Iterator it=list.iterator();
while (it.hasNext()){
   System.out.println(it.next());
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道如果我使用for-each而不是有任何性能优势Iterator.现在在Java中使用Iterator也是一种不好的做法?

Tal*_*ala 87

for-each是使用的语法糖iterators(方法2).

iterators如果需要在循环中修改集合,则可能需要使用.第一种方法会抛出异常.

for (String i : list) {
    System.out.println(i);
    list.remove(i); // throws exception
} 

Iterator it=list.iterator();
while (it.hasNext()){
    System.out.println(it.next());
    it.remove(); // valid here
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,要记住,添加/删除您正在循环的集合中的项目并不是一种好的做法,因为您突出显示了这一点. (8认同)

Ash*_*sia 16

区别在于语法糖,除了Iterator可以从正在迭代的Collection中删除项目.从技术上讲,增强的for循环允许你遍历任何Iterable,它至少包括Collections和数组.

不要担心性能差异.这种微观优化是无关紧要的分心.如果您需要随时删除项目,请使用迭代器.否则for循环往往更常用,因为它们更具可读性,即:

for (String s : stringList) { ... }
Run Code Online (Sandbox Code Playgroud)

VS:

for (Iterator<String> iter = stringList.iterator(); iter.hasNext(); ) {
  String s = iter.next();
  ...
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*kur 9

for-each是一个高级循环结构.在内部,它创建一个迭代器并迭代Collection.只有在for-each构造上使用实际Iterator对象的可能优点是,您可以使用Iterator的方法修改集合.remove().在迭代时不使用Iterator方法修改集合将产生ConcurrentModificationException.

  • *可以*不"会"导致ConcurrentModificationException (2认同)