Answers:
Set
,并且永远不会被put()
操作取代。
Set
,但刚刚意识到那只put()
会覆盖值,而不是键。在这种情况下,再次将相同的值放在键旁边,这可能比检查键是否存在并放置更好,也可能不会更好。无论哪种方式,我都知道它是如何工作的。
HashSet
是以的形式实现的效果HashMap
。但是,除非您是此类的开发人员之一,否则很难知道。
您需要了解的第一件事是,它的HashSet
行为类似于Set
,这意味着您将对象直接添加到中,HashSet
并且该对象不能包含重复项。您只需直接在中添加值即可HashSet
。
但是,HashMap
是一种Map
。这意味着每次添加条目时,都会添加一个键值对。
输入中HashMap
可以有重复的值,但不能有重复的键。在HashMap
新条目中将替换旧条目。最近的条目将在中HashMap
。
了解HashMap和HashSet之间的链接:
记住,HashMap
不能有重复的密钥。幕后HashSet
使用HashMap
。
当您尝试将任何对象添加到中时HashSet
,该条目实际上被存储为-中的键,与HashMap
- HashMap
幕后使用的键相同HashSet
。由于此基础HashMap
需要键值对,因此会为我们生成一个虚拟值。
现在,当您尝试将另一个重复的对象插入同一对象时HashSet
,它将再次尝试将其作为钥匙插入HashMap
下面。但是,HashMap
不支持重复。因此,HashSet
仍将导致仅具有该类型的一个值。附带说明一下,对于每个重复的密钥,由于在HashSet中为我们的条目生成的值是某个随机值/虚拟值,因此根本不会替换该密钥。它会被忽略,因为删除键并添加相同的键(伪值相同)根本没有任何意义。
摘要:
HashMap
允许重复values
,但不允许重复keys
。
HashSet
不能包含重复项。
要了解对象的添加是否成功完成,可以检查boolean
调用时返回的值,.add()
并查看它是否返回true
或false
。如果返回true
,则将其插入。
HashMap allows duplicate values
HashMap用新值替换了旧值。
该文档是对这个很清楚:HashSet.add
不更换:
如果指定的元素尚不存在,则将其添加到该集合中。更正式地说,如果此元素集中不包含任何元素e2,则将指定元素e添加到该元素集合中,使得(e == null?e2 == null:e.equals(e2))。如果此集合已包含该元素,则调用将使该集合保持不变并返回false。
但将替换为:HashMap.put
如果该映射先前包含该键的映射,则将替换旧值。
如果是HashSet,则不会替换它。
从文档:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E)
“将指定的元素添加到该集合中(如果尚不存在)。更正式地,如果此集合不包含元素e2,则将指定的元素e添加到该集合中,使得(e == null?e2 == null:e.equals( e2))。如果此集合已包含该元素,则调用将使该集合保持不变并返回false。
如果我错了,请纠正我,但是您得到的是字符串,“ Hi” ==“ Hi”并不总是正确的(因为它们不一定是同一个对象)。
答案为1的原因是因为JVM将尽可能重用字符串对象。在这种情况下,JVM将重用字符串对象,从而覆盖Hashmap / Hashset中的项目。
但是您不能保证这种行为(因为它可能是具有相同值“ Hi”的另一个字符串对象)。您看到的行为仅仅是由于JVM的优化。
HashMap
基本上包含Entry
随后包含Key(Object)
和的内容Value(Object)
。正如某些人已经指出的那样,内部HashSet
是HashMap
and HashMap
确实替换值。但是它确实替换了键吗?HashMap
保持其值作为基础中的键,HashMap
而值只是一个伪对象。因此,如果您尝试在HashMap(基础Map中的键)中重新插入相同的Value,它将替换伪值而不是Key(HashSet的值)。
查看下面的HashSet类代码:
public boolean [More ...] add(E e) {
return map.put(e, PRESENT)==null;
}
这里e是HashSet的值,但是基础map。的键,而键永远不会被替换。希望我能消除混乱。
HashMap
是否key
已存在?put
map