【问题标题】:Why is it preferred to use immutable objects as elements of a Set?为什么首选使用不可变对象作为 Set 的元素?
【发布时间】:2016-05-19 23:02:02
【问题描述】:

我读了here:

不可变对象是很好的 Map 键和 Set 元素,因为这些 通常一旦创建就不会更改。

【问题讨论】:

  • Map 和 set 实现通常使用元素的状态来存储它们。如果该状态发生变化,您之后将很难/不可能重新定位它们。对于不可变对象,这是不可能的。
  • 其他语言甚至强制要求它们的 Map 键和 Set 元素的等价物是不可变的。例如,C++ std::mapstd::unordered_map 键是 const
  • @SotiriosDelimanolis 状态,你的意思是对象的数据(实例字段),对吧?
  • 是的,我就是这个意思。

标签: java dictionary collections set immutability


【解决方案1】:

由于这些集合依赖于散列,因此对其hashCode 有贡献的字段应该是不可变的。

HashMap 想要存储一个键值对时,它使用其key 的hashCode 并为该对找出一个位置,

相同的技术将用于元素检索(例如:包含、获取等)。现在想象hashCode 在元素检索时产生的值与添加元素时产生的值不同?我们能否正确定位元素?没有。

HashSetHashMap 没有什么不同。

这一切都是为了拥有能够正确比较对象的hashCodeequals 方法,不变性使得推理这些方法的正确性变得更加容易。

【讨论】:

  • 这也适用于非基于哈希的地图和集合,如 TreeMap 和 TreeSet,其中项目放置由 comparecompareTo 结果工作,任何会改变比较结果的东西都会破坏数据结构.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多