【问题标题】:What is difference between isEmpty() and size() for hashmap if used under if condition?如果在 if 条件下使用 hashmap 的 isEmpty() 和 size() 有什么区别?
【发布时间】:2019-03-12 04:43:20
【问题描述】:

我必须处理发生在Hashmap 上的NullPointerException。我应该在if 条件中使用map.isEmpty() 或(map.size() > 0) 吗?

哪个更好?

【问题讨论】:

  • 它们是相同的(实际上,它们是相反的)。但可能两者都不会阻止您的空指针异常。
  • 在这种情况下如何取消空指针异常?
  • 好吧,假设您的空指针异常正在发生,因为您的Map 为空,您应该检查您的Map 是否为空。但也许这个异常是由于其他原因而发生的——如果没有看到你的代码就无法判断。

标签: java


【解决方案1】:

首先对Map对象进行空检查,然后Empty检查以避免NullPointerException

if(map != null && !map.isEmpty())

【讨论】:

  • 在使用上述 if 条件后,我摆脱了 NullPointerException。感谢输入。
【解决方案2】:

map.size()O(1) ,而map.isEmpty() 的复杂度也是一样的,所以从复杂度和执行上来说基本没有区别。

如果你仔细看

public boolean isEmpty() {
    return size == 0;
}

它什么都不做,只是返回 size==0;

.size() 更喜欢.isEmpty() 的其他原因可以是:

  1. 更具表现力(代码更易于阅读和维护)

仅供参考,map.size() 在处理收集方面比 map.isEmpty() 具有各种优势,就像您可以通过 map.size() 进行以下操作,而不是稍后。

String str = "abcd";
Map<Integer,String> map = new HashMap<>();
String[] strings = str.split("");
for(String s: strings) {
     map.put(map.size(), s);
 }

参考Converting string to Map<Integer,String> in java 8

【讨论】:

  • 再次检查答案,我错过了。两者实际上是相同的。我想到了一般收藏:/
  • 好的,只是速度没有任何数量级。
【解决方案3】:

这是HashMap 类中size()isEmpty()implementations

public int size() {
    return size;
}

public boolean isEmpty() {
    return size == 0;
}

所以,HashMap#isEmpty() 只是检查 size() 返回的相同的 size 变量。它主要只是一种方便的方法。您可能希望使用 isEmpty() 而不是手动比较大小的一个原因是前者可以更清楚地显示您的代码实际检查的内容。

【讨论】:

  • +1,但isEmpty() 不一定只是一种方便的方法:它由java.util.Map 指定,并且在该接口的至少一个实现中(即@ 987654322@) 比size() 快得多。
  • @ruakh 好东西,我不知道。
  • 如果 hashmap 中没有键值对,size() 是否会返回非零值?
  • @RadhickaPardessi AFAIK 的大小永远不应该为负数。
  • @ruakh 我预计LinkedList 会是这种情况,但令人惊讶的是,事实并非如此。它只是继承了AbstractCollection implementation
【解决方案4】:

map.size() == 0 等于 map.isEmpty()。例如。 IntelliJ IDEA 检查始终使用isEmpty() 而不是size() == 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2013-10-13
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多