关于mutable type的等价性
有时候,观察等价性可能到时bug,甚至可能破坏RI
例:
其结果为
为什么我们对Set中的元素list进行了mutate后(仅仅在list中增加了一个元素"B"),再次在Set中寻找list时,尽管Set中确实包含一个[A,B]的List,但set.contain(list)的结果却是false?
因为List是一个mutable type,而对mutable type具体实例进行的mutation操作会影响这个实例equal()和hashCode()的结果。
具体而言,当List list被mutated后,它的hashCode会发生改变,但是在HashSet中并没有把list移到一个新的bucket(哈希桶),因此,这个List就会再也找不到了。(因为它的HashCode变了, 但在HashSet的位置却没有改变)
如图所示,对list的add操作前后,HashSet没有发生改变,改变的只有list的hash值
因此,对于即合Set同一个元素list,当其经过mutation操作,使hashCode发生了改变,Set中也无法找到当出的list了。