【问题标题】:Collections.emptySet() vs new HashSet<>() [closed]Collections.emptySet() 与 new HashSet<>() [关闭]
【发布时间】:2020-10-16 03:11:20
【问题描述】:

如何验证 Set 是空集还是 new HashSet() ? 尝试了两种方法 -

  1. size
  2. CollectionUtils.isEmpty() 两者的结果相同。

【问题讨论】:

  • 为什么需要知道?
  • set == Collections.EMPTY_SET

标签: java collections hashset is-empty


【解决方案1】:

当然,新的new HashSet&lt;&gt;() 是空的,Set.of() 或 Collections.emptySet() 也是空的。重点是:两者都是空集,我不知道您为什么要区分这两者。

一个区别是new HashSet&lt;&gt;() 现在是空的,但以后可能不是空的(可以更改;您可以向其中添加内容),而根据规范,Set.of() 或 Collections.emptySet() 的结果,它们现在是空的,以后也会是空的:你不能向它们添加任何东西,在它们上调用 .add 会导致运行时异常。

这无异于问:我怎么知道它是否是不可变的。不幸的是,你基本上不能,所以这又回到了:你为什么需要知道?

【讨论】:

    【解决方案2】:

    Collections.emptySet() 在java.util.Collections 内返回一个静态类EmptySet,但new HashSet&lt;&gt;() 返回一个java.util.HashSet 类。两个集合都是空的,即实例化后 size = 0 但您可以通过调用 .getClass() 来区分这两个集合,这将返回:

    class java.util.Collections$EmptySet
    class java.util.HashSet
    

    【讨论】:

      【解决方案3】:

      使用 .getClass 查看使用的不同实现。

      【讨论】:

        【解决方案4】:

        我有一种实用方法可用于执行操作 -

        Collections.EMPTY_SET.equals(mySet)

        感谢大家的回答。

        【讨论】:

        • 错了。 Collections.EMPTY_SET.equals(new HashSet&lt;&gt;()) 将评估为 true。显然,您从其他地方得到了这个想法并在没有真正理解的情况下使用它,甚至没有重新检查结果。这就是所谓的 Cargo Cult 编程。正确的术语是Collections.EMPTY_SET == mySet 来检查它是否不仅相等而且是同一个对象。
        猜你喜欢
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2018-10-31
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        相关资源
        最近更新 更多