有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么Set实现不只存储键?

我知道Set使用Map的实现<;K、 V>;,其中,集合元素是。但是值发生了什么变化?它们使用private static final Object PRESENT = new Object()作为每个键的常量

酷。但是为什么呢?这意味着对于每个键,我们将存储我们永远不会使用的值,这样我们就可以重用Map的实现?为什么?难道他们就不能进行关键的实现吗?那个常数是用过的,还是只是“固定”在那个里


共 (2) 个答案

  1. # 1 楼答案

    对于可以在哈希集中保存条目的每个潜在“位置”,必须能够判断该位置是否已被占用

    如果您想像HashSet一样支持null的键值,那么就不能使用key=null作为“notused”指示符。因为你需要用钥匙。equals()若要在集合中查找对象,不能有一个可能意外等于(不完全相同)实际关键点的特殊关键点对象

    因此,您需要一个独立的标志,除了关键,以说明是否'的地方'是占领。这就像是一个对象引用一样;然后可以重用映射实现

  2. # 2 楼答案

    正如在实现中提到的,若您可以看到HashSet的add方法返回布尔值

    add方法调用内部HashMap上的put(key, PRESENT)remove方法调用内部HashMap上的remove(key),但它必须返回一个boolean指示键是否存在。如果null被存储为值,那么HashSet将需要首先调用containsKey,然后调用remove,以确定键是否存在额外开销。这里,只有一个Object的内存开销,这是非常小的

    public boolean add(E e)
    {
            return map.put(e, PRESENT)==null;
    }