【问题标题】:if(listStr.size == 0){ versus if(listStr.isEmpty()){if(listStr.size == 0){ 与 if(listStr.isEmpty()){
【发布时间】:2012-02-18 13:48:22
【问题描述】:
List<String> listStr = new ArrayList<String>();

if(listStr.size == 0){

}

if(listStr.isEmpty()){

}

在我看来,使用listStr.isEmpty() 的好处之一是它不检查列表的大小,然后将其与零进行比较,它只是检查列表是否为空。我经常在代码库中看到if(listStr.size == 0) 而不是if(listStr.isEmpty()),还有其他优势吗?是否有我不知道的以这种方式检查的原因?

【问题讨论】:

  • 在 1.6 中,ArrayList.isEmpty 实现为 return return size == 0;

标签: java


【解决方案1】:

this question 的答案可以给你答案。基本上,在某些列表的实现中,isEmpty() 方法会检查大小是否为零(因此从性能的角度来看,它们实际上是等效的)。然而,在其他类型的列表(例如链表)中,计数项目比检查它是否为空需要更多的时间。

因此,使用isEmpty() 方法检查列表是否为空总是很方便。之所以在所有类型的列表中提供这样的方法,也和接口有关,因为ArrayListVectorLinkedList实现了相同的List接口:this interfaceisEmpty()方法;然后,每种特定类型的列表都提供了其isEmpty() 方法的实现。

【讨论】:

  • 不错的答案,只有一条评论:LinkedList 的 size() 实现不遍历列表,而是在添加或删除新元素时跟踪大小。因此,LinkedLists 的 size() 与 isEmpty()(它们从 AbstractCollection 继承)的性能根本没有区别。话虽如此,我同意可能存在 size() 实现比 isEmpty() 慢的数据结构,但合理的实现不会。另外,我相信您也可以在这里提到 DRY 原则作为检查是否size() == 0 在大多数 isEmpty() 方法中已经为您完成了。
【解决方案2】:

不,没有理由。 isEmpty() 表达的意图更清楚,应该是首选。 PMD 甚至为此提供了a rule。不过没关系。

【讨论】:

  • 没错。另外,在 javadoc 中查找它。无论如何,有些实现会从 isEmpty() 调用 size()。
【解决方案3】:

.size() 可以是 O(1) 或 O(N),具体取决于数据结构; .isEmpty() 永远不会是 O(N)。

【讨论】:

  • 我不明白为什么 isEmpty 总是 O(1) (但我同意 isEmpty() 应该总是至少和 size() 一样快)。它也很可能取决于数据结构。我不知道任何大小为 O(n) 的标准集合。有吗?
  • 请尝试想象一个。任何带有标记的结构 - C 字符串、以 NULL 结尾的指针数组、以 nil 结尾的单元格列表。所有这些都可以作为缓存长度的混合类型的基础,但这不是免费的。 ConcurrentLinkedQueue
【解决方案4】:

虽然isEmpty() 可以更好地表达意图,正如 JB Nizet 所建议的那样。如果您是一名老派程序员,您的风格可能倾向于.size() &gt; 0 等表达方式。因此,如果答案可以是对某人意图的看法,那么答案也可以是您的肌肉记忆告诉您的。

在许多情况下size()isEmpty 与其他人所说的几乎相同。如果您要编写软件,您不想过早地进行优化。我认为这个问题的好奇心是有道理的,但是为了有效/高效,如果最佳性能并不重要,请按照对您来说自然的方式进行编码。专注于这些微妙的行为实际上可能会浪费您的开发时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多