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

标签 java collections map set

我想知道让 Java 的 Map.put(key, value) 方法覆盖集合中已经存在的等效键值的原因是什么,而 Set.add( value) 不会覆盖集合中已存在的等效值?

编辑:

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

我有点不同意这个观点。
示例:包含一组“Person”对象的集合。为了更新关于那个人的一些信息,你可能想要传递一个新的、更新的人对象来覆盖旧的、过时的人对象。在这种情况下,Person 将持有一个标识该个人的主键,并且该集合将仅根据他们的主键来识别和比较人们。这个主键是个人身份的一部分,而不是像 Map 这样的外部引用。

最佳答案

Map 行为允许更改与等效键关联的值。这是一个很常见的用例:a : b 变成 a : c

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

编辑:

我可以看到该行为的一个潜在用途是内存预算受限,创建了许多重但等效的对象,并且在不同的地方引用了不同的相同版本,从而防止了对重复对象的垃圾收集.然而,之前遇到过这个问题,我认为这种行为甚至不是解决它的最佳方法。

关于Java - 为什么 Map.put() 覆盖而 Set.add() 不覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978087/

相关文章:

java - .Net 客户端 - 使用 tls1.2 的 Java 服务器连接问题

java - 通过 Ansible playbook 部署应用程序,而不会导致双方瘫痪

java - 为什么 java 在...复杂时返回 java.util.LinkedHashMap

c# 到 c++ 字典到 unordered_map 结果

java - 在 java 中打印 ArrayList 时的不同输出

Javax 验证 : Constraint Violations for Map

在 Mac OS X 上移动到另一个屏幕/桌面/显示器时,Java Swing 应用程序窗口消失

java - Spring 3 MVC + 安全

c++ - 我如何将 map 的反面复制到另一张 map ?

perl - Perl 中是否有诸如 zip 和 fold 之类的功能?