我想知道为什么Java的Map.put(key, value)
方法会覆盖已经存在于集合中的键相等的值,而Set.add(value)
不会覆盖已经存在于集合中的等效值?
编辑:
看起来大多数人认为,在集合中评估为相等的对象应在所有方面都相等,因此Set.add(Object)是否覆盖了等效值的对象并不重要。如果两个对象在评估上相等,但实际上持有不同的数据,则Map类型的集合是更合适的容器。
我有些不同意这种观点。
例如:一个保存"Person"对象组的集合。为了更新关于该人的一些信息,您可能希望向集合传递一个新的、更新的人对象来覆盖旧的、过时的人对象。在这种情况下,Person将持有一个标识该个体的主键,集合将仅根据它们的主键识别和比较人物。这个主键是人的一部分身份,而不是类似于Map所暗示的外部引用。
java.util.Set
的记录行为。你当然可以创建自己的数据结构来实现你所描述的功能,但如果你期望现有代码按照你想要的方式运行,而不是按照设计的方式运行,那么你会遇到麻烦的。 - dimo414