Chr*_*row 21 java collections map set
我想知道Java的Map.put(key, value)方法是否会覆盖已经在集合中的等价键值,同时Set.add(value)不会覆盖已经存在于集合中的预先存在的等价值的原因是什么?
看起来多数人的观点是,评估为相等的集合中的对象在每个方面都应该相等,因此,如果Set.add(Object)覆盖等价的对象,则无关紧要.如果两个对象评估为相等,但实际上确实包含不同的数据,那么Map类型集合是更合适的容器.
我有点不同意这个观点.
示例:包含一组"Person"对象的集合.为了更新有关该人员的某些信息,您可能希望传递该集合一个新的,更新的人员对象来覆盖旧的,过时的人员对象.在这种情况下,Person将持有一个主键,用于标识该个人,并且该组将仅基于其主键来识别和比较人员.这个主键是人的身份的一部分,而不是外部参考,如地图意味着.
该Map行为允许更改与等效键关联的值.这是一个非常常见的用例:a : b成为a : c.
是的,覆盖Set内容add可能会改变一些东西(参考值) - 但这似乎是一个非常狭窄的用例(无论如何都可以完成 - 总是尝试在添加前删除:) s.remove(o); s.add(o);相对于大多数情况下会得到的 -周期没什么.
编辑:
我可以看到的这种行为的一个潜在用途是,有一个受限的内存预算,创建了许多重等但等价的对象,并在不同的地方引用了不同的相同版本,防止了重复的垃圾收集.然而,在遇到这个问题之前,我认为这种行为甚至不是解决问题的最佳方法.
在我看来,在Set中覆盖一些东西是没有意义的,因为没有什么会改变.
但是,更新地图时,键可能相同,但值可能不同.