【发布时间】:2020-10-16 03:11:20
【问题描述】:
如何验证 Set 是空集还是 new HashSet() ? 尝试了两种方法 -
size-
CollectionUtils.isEmpty()两者的结果相同。
【问题讨论】:
-
为什么需要知道?
-
set == Collections.EMPTY_SET
标签: java collections hashset is-empty
如何验证 Set 是空集还是 new HashSet() ? 尝试了两种方法 -
sizeCollectionUtils.isEmpty()
两者的结果相同。【问题讨论】:
set == Collections.EMPTY_SET
标签: java collections hashset is-empty
当然,新的new HashSet<>() 是空的,Set.of() 或 Collections.emptySet() 也是空的。重点是:两者都是空集,我不知道您为什么要区分这两者。
一个区别是new HashSet<>() 现在是空的,但以后可能不是空的(可以更改;您可以向其中添加内容),而根据规范,Set.of() 或 Collections.emptySet() 的结果,它们现在是空的,以后也会是空的:你不能向它们添加任何东西,在它们上调用 .add 会导致运行时异常。
这无异于问:我怎么知道它是否是不可变的。不幸的是,你基本上不能,所以这又回到了:你为什么需要知道?
【讨论】:
Collections.emptySet() 在java.util.Collections 内返回一个静态类EmptySet,但new HashSet<>() 返回一个java.util.HashSet 类。两个集合都是空的,即实例化后 size = 0 但您可以通过调用 .getClass() 来区分这两个集合,这将返回:
class java.util.Collections$EmptySet
class java.util.HashSet
【讨论】:
使用 .getClass 查看使用的不同实现。
【讨论】:
我有一种实用方法可用于执行操作 -
Collections.EMPTY_SET.equals(mySet)
感谢大家的回答。
【讨论】:
Collections.EMPTY_SET.equals(new HashSet<>()) 将评估为 true。显然,您从其他地方得到了这个想法并在没有真正理解的情况下使用它,甚至没有重新检查结果。这就是所谓的 Cargo Cult 编程。正确的术语是Collections.EMPTY_SET == mySet 来检查它是否不仅相等而且是同一个对象。