首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Map.put()重写,而Set.add()不重写?

为什么Map.put()重写,而Set.add()不重写?
EN

Stack Overflow用户
提问于 2010-06-05 06:01:49
回答 3查看 23K关注 0票数 23

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

编辑:

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

我有点不同意这个观点。

例如:包含一组"Person“对象的集合。为了更新关于该person的一些信息,您可能希望传递一个新的、已更新的person对象来覆盖旧的、过时的person对象。在这种情况下,一个人将持有标识该个人的主键,该集合将仅根据他们的主键来标识和比较人。这个主键是人员身份的一部分,而不是像Map那样的外部引用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-05 06:09:44

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

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

编辑:

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

票数 9
EN

Stack Overflow用户

发布于 2010-06-05 06:10:00

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-03-22 19:52:54

请注意Map实际上并没有太大的不同...它可能总是更改值,但是(至少在Sun的实现中)键将保持不变,即使以后对put()的调用使用与原始实例相同的不同实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2978087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档