为什么首选使用不可变对象作为Set的元素?

Sol*_*ace 0 java collections dictionary set immutability

在这里读到:

不可变对象是良好的Map键和Set元素,因为这些通常在创建后不会更改.

Sle*_*idi 6

因为这些集合依赖于散列,所以对它们有贡献的字段hashCode应该是不可变的.

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

相同的技术将用于元素检索(例如:contains,get等).现在假设hashCode元素检索产生的值与添加元素时产生的值不同?我们能够正确找到元素吗?没有.

HashSet与a没什么不同HashMap.

这是关于拥有能够正确比较对象的方法hashCodeequals方法,不变性使得更容易推断这些方法的正确性.

  • 这也适用于非基于散列的映射和集合,如TreeMap和TreeSet,其中项目放置通过`compare`或`compareTo`结果工作,任何会改变比较结果的东西都会破坏数据结构. (2认同)