请考虑下面的代码:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs。size()
将给出1,因为HashSet不允许重复,所以只存储一个元素。
我想知道如果我们添加了重复的元素,那么它是替换了前面的元素,还是根本没有添加它?
另外,对于相同的情况,使用HashMap
会发生什么?
文档在这方面非常清楚:HashSet。添加不替换:
如果指定的元素尚未存在,则将其添加到此集合。更正式地说,如果这个集合不包含元素e2,那么将指定的元素e添加到这个集合中(e==null?e2==null:e.equals(e2))。如果该集合已经包含该元素,则调用将保持集合不变,并返回false。
但是HashMap。put
将替换:
如果映射之前包含键的映射,则替换旧值。
您需要知道的第一件事是,HashSet
的行为类似于Set
,这意味着您将对象直接添加到HashSet
中,并且它不能包含重复项。您只需直接在HashSet
中添加值。
但是,HashMap
是Map
类型。这意味着每次添加条目时,都要添加键值对。
在HashMap
中,可以有重复的值,但不能有重复的键。在HashMap
中,新条目将替换旧条目。最近的条目将在HashMap
中。
理解HashMap和HashSet之间的链接:
记住,HashMap
不能有重复的密钥。幕后HashSet
使用HashMap
。
当您试图将任何对象添加到HashSet
中时,该条目实际上作为键存储在HashMap
中,与HashSet
场景后面使用的HashMap
相同。由于这个底层的HashMap
需要一个键值对,因此会为我们生成一个伪值。
现在,当您尝试将另一个重复对象插入同一个HashSet
时,它将再次尝试将其作为键插入下方的HashMap
。但是,HashMap
不支持重复。因此,HashSet
仍将导致只有一个该类型的值。顺便说一句,对于每个重复的键,因为HashSet中为我们的条目生成的值是一些随机/伪值,所以根本不会替换键。它将被忽略,因为删除密钥并添加回相同的密钥(伪值相同)根本没有意义。
总结:
HashMap
允许重复的值
,但不允许键
。HashSet
不能包含重复的。
要了解对象的添加是否成功完成,可以检查调用时返回的
布尔值。add()
并查看它是否返回true
或false
。如果返回true
,则会插入。
对于HashMap
,它用新值替换旧值。
在HashSet
的情况下,不插入该项。
问题内容: 请考虑以下代码: 将给出1,因为不允许重复,因此将只存储一个元素。 我想知道是否要添加重复元素,然后它会替换前一个元素还是根本不添加它? 另外,在相同情况下使用会发生什么? 问题答案: 在的情况下,它将旧值替换为新值。 如果是,则不会插入该项目。
我试图通过修改hashCode()和equals()方法()在HashSet中添加重复的值? 我试过下面的代码 根据我的理解,如果有两个“a”的副本,HashSet将首先获得hashCode()以获得正确的bucket,然后检查equals()的值,如果equals返回true,则不会添加,但如果返回false,则会添加。因此,为了向我的集合添加重复值,我重写equals(),它总是返回false
我有一个散列表 这是我的代码 我应该对我的代码做什么样的修改来确保它能按照我的要求编译和运行?
我刚学过JAVA,我对这段代码有一个问题: 现在我的包含!在这种情况下,我如何简单地避免重复?我以为HashSet不允许重复。
因此,我有一个hashmap ,它存储每个字符串的arraylist。但是当我用ArrayList的新值添加另一对时,其他键值将被替换。因此,不同键的所有值都是相同的。 添加的第一个键: 对于第二个键,列表中有不同。但是,当添加第二个键(在put()方法之后)时,第一个键的值已经被替换。
我试图创建一组int数组,问题是,如果我尝试这样做: 那么s有两个对象,但应该只有一个。注意:它是否是HashSet并不重要 现在如果我试着用ArrayList做这个 那么s有一个对象。 我想了一种方法来避免第一个代码中的错误,并将每个数组的hashcode存储在hashset中,如下所示: 它适用于第一种情况(1,2,3),但在有碰撞的情况下它不起作用,所以我必须管理碰撞。所以,我认为我正在做的