java为什么Set实现不只存储键?
我知道Set使用Map的实现<;K、 V>;,其中,集合元素是键。但是值发生了什么变化?它们使用private static final Object PRESENT = new Object()
作为每个键的常量
酷。但是为什么呢?这意味着对于每个键,我们将存储我们永远不会使用的值,这样我们就可以重用Map的实现?为什么?难道他们就不能进行关键的实现吗?那个常数是用过的,还是只是“固定”在那个里
你可以在下面搜索框中键入要查询的问题!
我知道Set使用Map的实现<;K、 V>;,其中,集合元素是键。但是值发生了什么变化?它们使用private static final Object PRESENT = new Object()
作为每个键的常量
酷。但是为什么呢?这意味着对于每个键,我们将存储我们永远不会使用的值,这样我们就可以重用Map的实现?为什么?难道他们就不能进行关键的实现吗?那个常数是用过的,还是只是“固定”在那个里
# 1 楼答案
对于可以在哈希集中保存条目的每个潜在“位置”,必须能够判断该位置是否已被占用
如果您想像HashSet一样支持null的键值,那么就不能使用key=null作为“notused”指示符。因为你需要用钥匙。equals()若要在集合中查找对象,不能有一个可能意外等于(不完全相同)实际关键点的特殊关键点对象
因此,您需要一个独立的标志,除了关键,以说明是否'的地方'是占领。这就像是一个对象引用一样;然后可以重用映射实现
# 2 楼答案
正如在实现中提到的,若您可以看到HashSet的add方法返回布尔值
add
方法调用内部HashMap
上的put(key, PRESENT)
。remove
方法调用内部HashMap
上的remove(key)
,但它必须返回一个boolean
指示键是否存在。如果null
被存储为值,那么HashSet
将需要首先调用containsKey
,然后调用remove
,以确定键是否存在额外开销。这里,只有一个Object
的内存开销,这是非常小的