immutable类型的等价性
一、从三种角度定义等价性
- 等价关系
- AF(a)==AF(b)
- 观察等价性 :对两个对象调用任何相同的操作,都会得到相同的结果,则认为这两个对象是等价的
- 注 : 前两种等价是完全相同的
二、 ==
- 对于primitive,==判断的是值是否相等
- 对于reference,==判断的是内存地址是否相等
三、equals
The contract of equals
- equals必须定义等价关系:自反、传递、对称
- 除非对象被修改了,否则调用多次equals应是同样的结果
- 遇到null时返回false
- 相等的对象,其hashCode的结果必须相等
hashCode
- 只要重写equals,必须重写hashCode
- hashCode设计方法 : 通过equals计算中用到的所有信息的hashCode组合出新的hashCode
mutable类型的等价性
一、观察等价与行为等价
- 观察等价 : 不调用mutator的情况下(也就是不改变状态的情况),是否相等
- 行为等价 : 调用对象的任何方法都展示出一致的结果
- 对于immutable类型,观察等价也就意味着行为等价,因为immutable没有mutator
二、Java库中的惯例
- 在JDK中,不同的mutable类使用不同的等价性标准
- 不要将mutable类型放在HashSet中,因为,当mutable改变后,HashSet中的HashCode没有同步改变
三、结论
- 对于mutable类型,需要通过"=="运算符实现行为等价性,也就不需要重写equals
等价性总结
- immutable必须重写equals与hashCode
- mutable不应该重写equals与hashCode