【问题标题】:What is the difference between different for loops in Java?Java中不同的for循环有什么区别?
【发布时间】:2013-08-09 18:42:44
【问题描述】:

Java 有不同的for-loops 来遍历列表。例如:

public void myMethod(List list) {
    for (int i = 0; i <= list.size(); i++) {
        ...
    }
}

或者,我们可以这样写:

public void myMethod(List list) {
    for (String obj : list) {
        ...
    }
}

或者,我们可以使用列表迭代器:

public void myMethod(List list) {
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        ...
    } 
}

哪一个最好并且无需更多代码就可以阻止NullPointerExceptions?

【问题讨论】:

  • 不知道你在问什么。您似乎知道不同的类型,只需使用您想要的。
  • 性能或功能上的区别?
  • 现在你清楚我要问的还是大家都清楚
  • 好吧,有了第一个样本,您就可以访问索引 (i)。在第三个示例中,您可以更好地控制迭代。如果这些优势都不重要,您应该使用第二个示例
  • @subodh: 尊敬的,你应该求助于解释得很清楚的 Java 文档:docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html 另外,以后再搜索 SO,因为这个问题已经被问过无数次了。

标签: java for-loop foreach


【解决方案1】:

您的第二个变体是最好的(它基本上等同于您的第三个,但不那么冗长)。它优越的原因是因为您通过Iterator 循环而不是多次调用get(),因为您必须处理您的第一个变体。例如,对于LinkedLists,get() 是一个 O(n) 操作,这意味着第一个 sn-p 将是 O(n<sup>2</sup>),而第二个将是 O(n)

对于null,所有三个变体都会抛出NullPointerException;您应该事先检查null(或确保您的列表永远不会是null)。

【讨论】:

  • 如果 list=null,第二个 for 循环会做什么?
  • @subodh 查看我的编辑;在这种情况下,这三个都会产生 NPE。
  • 试试吧!编写一些代码,使列表为空,看看会发生什么。
  • 我不记得了,但我在某处读到,如果您使用第二种方法,可以忽略空指针
  • 为什么要忽略它们?它们是重要的错误消息,会告诉您您是否在做非法的事情。正如@arshajii 所说,如有必要,您可以通过添加 if 语句(如果 obj!= null)预先检查 null
【解决方案2】:

在我看来,第二种形式更好,因为它更短。在封面后面,它和你的第三种形式一样。

没有一种形式可以防止空指针异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2011-07-19
    相关资源
    最近更新 更多