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 valuesHashMap用新值替换了旧值。
该文档是对这个很清楚: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是HashMapand 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已存在?putmap