mutable数据类型的等价性

mutable类型数据的等价性可以分为2种:观察等价性和行为等价性

观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致

行为等价性:调用对象的任何方法都展示出一致的结果

对可变类型来说,往往倾向于实现严格的观察等价性,对不可变类型来说,不存在行为等价性,只存在观察等价性,因为不可变类型不能发生变化。

但在有些时候,观察等价性可能导致bug,甚至可能破坏RI

比如:

加入有一个List,并且把它放入Set:

检查Set是否包含List,结果显然包含:

然后改变List:

结果发现Set里竟然不包含List了!

但我们迭代的时候发现List在Set里面:

那么为什么Set的contains()函数表明List不在SetL里呢?

因为Java中可变类型的改变是会改它的hashCode的,当把List加入Set时,Set记录了当时List的hashCode,但后来List改了之后(add了一个元素),它的hashCode就变了,hashSet的contains()就无法分辨了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值