Java - 为什么Map.put()覆盖而Set.add()不覆盖?

2022-09-01 23:47:32

我想知道让Java的方法覆盖集合中已经存在的等效键d值,同时不覆盖集合中已经存在的预先存在的等效值背后的原理是什么?Map.put(key, value)Set.add(value)

编辑:

看起来多数人的观点是,一个集合中计算为相等的对象在各个方面都应该相等,因此Set.add(Object)是否覆盖等值的对象并不重要。如果两个对象的计算结果相等,但实际上保存了不同的数据,则 Map 类型集合是更合适的容器。

我有点不同意这个观点。
示例:包含一组“Person”对象的集合。为了更新有关该人员的一些信息,您可能希望传递一个新的、已更新的 person 对象,以覆盖旧的、过时的 person 对象。在这种情况下,一个人将持有一个识别该个人的主键,该集合将仅根据其主键来识别和比较人。此主键是人的身份的一部分,而不是 Map 所暗示的外部引用。


答案 1

该行为允许更改与等效键关联的值。这是一个非常常见的用例:成为 .Mapa : ba : c

是的,覆盖内容可能会改变一些东西(参考值) - 但这似乎是一个非常狭窄的用例(无论如何都可以完成 - 总是尝试在添加之前删除:)相对于在大多数情况下会得到的东西 - 没有周期。Setadds.remove(o); s.add(o);

编辑:

我可以看到这种行为的一个潜在用途是内存预算有限,创建大量重但等效的对象,并在不同位置引用不同的相等版本,防止对重复版本的垃圾回收。然而,以前遇到过这个问题,我不认为这种行为是解决它的最佳方法。


答案 2

在我看来,覆盖Set中的东西是没有意义的,因为什么都不会改变。

但是,更新地图时,键可能相同,但值可能不同。