Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么设置实现不';你不能只储存钥匙吗?_Java_Set_Key Value - Fatal编程技术网

Java 为什么设置实现不';你不能只储存钥匙吗?

Java 为什么设置实现不';你不能只储存钥匙吗?,java,set,key-value,Java,Set,Key Value,我知道Set使用Map的实现,其中Set元素是键。但是值发生了什么变化?它们使用私有静态最终对象PRESENT=new Object()作为每个键的常量 酷。但是为什么呢?这意味着对于每个键,我们将存储我们永远不会使用的值,这样我们就可以重用Map的实现?为什么?难道他们就不能进行关键的实现吗?那个常量是否曾经被使用过,或者它只是“坐”在那个里?如实现中所述,若你们能看到HashSet返回布尔值的add方法的话 add方法调用内部HashMap上的put(key,PRESENT)。remove方

我知道Set使用Map的实现,其中Set元素是键。但是值发生了什么变化?它们使用
私有静态最终对象PRESENT=new Object()
作为每个键的常量


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

如实现中所述,若你们能看到HashSet返回布尔值的add方法的话

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

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

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

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


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

您的意思是
HashSet
,如果是,具体是哪个实现?是的,您可以指向HashSet,其他实现几乎相同。他们都用地图来储存钥匙……不完全是。要创建一个
散列集
只需对
键进行散列即可。对于
集合
,您可以像查找
映射
一样查找
。实际上不需要任何值来查找密钥
HashSet
使用
HashMap
仅仅是因为它更容易重用
HashMap的
方法,然后重写代码。假设在我的HashSet实现中,我的bucket是一个T数组(或ArrayList)。我想将值“null”添加到我的HashSet中。该实现计算null的散列,该散列选择特定的bucket。现在,您如何知道“null”是否已经在bucket中?空桶将包含什么?空桶将包含null。但是,您希望放入集合中的null值可以是
Object()
的私有静态实例,其他人不知道该实例,但实现使用它来表示null。如果您想查看集合是否包含空值,则实现将检查特定的
对象
。我想您可以这样做,但是“contains()”必须找到一个与正在查找的对象相等的元素,但它是!=私人物品,我承认。我将收回这个答案。