gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:54:10 24 4
gpt4 key购买 nike

我想知道让 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com