Java 为什么HashSet.add(对象)不替换现有对象?

Java 为什么HashSet.add(对象)不替换现有对象?,java,data-structures,hashset,Java,Data Structures,Hashset,这更像是一个设计问题,我很好奇为什么HashSet不支持add的put-like操作 如果我想用与现有对象相同的哈希代码更新对象,我必须执行以下操作: hashSet.remove(o); hasSet.add(o); 我想 hashSet.add(o); 应该已经足够了,因为它在引擎盖下使用了HashMap。没有必要将HashSet元素替换为与其相等的元素。在HashMap中,有一点需要替换现有键的条目,因为值可以不同 我想一个hashSet.addo;应该已经足够了,因为它在引擎盖下使用

这更像是一个设计问题,我很好奇为什么HashSet不支持add的put-like操作

如果我想用与现有对象相同的哈希代码更新对象,我必须执行以下操作:

hashSet.remove(o);
hasSet.add(o);
我想

hashSet.add(o);

应该已经足够了,因为它在引擎盖下使用了HashMap。

没有必要将HashSet元素替换为与其相等的元素。在HashMap中,有一点需要替换现有键的条目,因为值可以不同

我想一个hashSet.addo;应该已经足够了,因为它在引擎盖下使用了HashMap


事实上不是。HashSet由HashMap支持是正确的,其中集合的每个元素都是键,值是一个伪对象。但是,由于map.putkey,value不会替换键,如果映射中存在相等的键,则它只替换值,如果元素在集合中已经存在,则HashSet无法替换该元素,除非先将其删除。

没有必要将HashSet元素替换为与其相等的元素。在HashMap中,有一点需要替换现有键的条目,因为值可以不同

我想一个hashSet.addo;应该已经足够了,因为它在引擎盖下使用了HashMap

事实上不是。HashSet由HashMap支持是正确的,其中集合的每个元素都是键,值是一个伪对象。但是,由于map.putkey、value不会替换键(如果映射中存在相等的键),因此它只替换值,而HashSet无法替换元素(如果元素已存在于集合中,则必须先将其删除)。

该集合明确指定了此行为

如果指定的元素尚未存在,则将其添加到此集合可选操作

集合明确规定了这种行为

如果指定的元素尚未存在,则将其添加到此集合可选操作

集合的目的是跟踪添加到集合中的独特元素。但是这里的unique意味着不等于集合中的任何其他内容,正如.equals方法所定义的那样

如果你需要添加两个相等的东西,这表明要么你根本不想要一个集合,要么你的.equals方法不太正确。.equals的意义在于,如果你做对了,你就不会真正关心a和b中的哪一个在集合中,如果它们相等。

集合的目的是跟踪添加到集合中的唯一元素。但是这里的unique意味着不等于集合中的任何其他内容,正如.equals方法所定义的那样


如果你需要添加两个相等的东西,这表明要么你根本不想要一个集合,要么你的.equals方法不太正确。.equals的意义在于,如果你做对了,你就不会真正关心a和b中哪一个是相等的。我的类的hashCode只基于一个字段,该字段是与db中的行id类似的id字段。这就是问题所在,没有值,只有一个伪值。@F.O.O还请注意,这里重要的不仅仅是hashCode,还有equals:。在一个HashSet中可能有多个值与冲突的hashcode,查找的效率比这个低。我明白了。我的类的hashCode只基于一个字段,该字段是与db中的行id类似的id字段。这就是问题所在,没有值,只有一个伪值。@F.O.O还请注意,这里重要的不仅仅是hashCode,还有equals:。一个HashSet中可能有多个值与冲突的hashcode,查找的效率比这个低。您的问题是您对HashSet语义的理解不正确。换句话说:在猜测如何改进API之前,首先尝试理解API-@我的问题仍然是个问题。一个以“为什么”开头的问题。所以我想学习。当然。我只是指出:在你的情况下,事先的研究会很容易;就像阅读相应的javadocs一样,javadocs是解释语义而不是解释原因的伟大独裁者@埃兰斯散发出一些光芒。我清楚地知道如何使用API,正如我在问题中所演示的那样。事实上,我是亲身体验的。您的问题是您对哈希集语义的理解不正确。换句话说:在猜测如何改进API之前,首先尝试理解API-@我的问题仍然是个问题。一个以“为什么”开头的问题。所以我想学习。当然。我只是指出:在你的情况下,事先的研究会很容易;就像阅读相应的javadocs一样,javadocs是解释语义而不是解释原因的伟大独裁者@埃兰斯散发出一些光芒。我清楚地知道如何使用API,正如我在问题中所演示的那样。事实上,我是亲身体验的。