文章目录
ADT和OOP中的“等价性”
1 等价性equals()和==
- 基本数据类型
- 比较值是否相等,用
==
- 比较值是否相等,用
- 对象数据类型
- 比较值是否相等,用
equals()
- 比较地址是否相等,用
==
- 比较值是否相等,用
2 equals()的自反、传递、对称
- 在自定义ADT时,需要重写
Object
的equals()
- 重写时一定要满足自反、对称、传递原则。
- 如果涉及
hashmap
或者hashset
存储key
信息,则必须重写equals
和hashCode
方法。
3 hashCode()
- 等价的对象必须有相同的hashCode
- 程序会首先使用hashcode来判定两个对象,如果两个hashcode相等,才会调用equals进行判断;如果hashcode不等,则不管equals是否相等,直接返回不相等。
4 不可变对象的引用等价性、对象等价性
- 引用等价性:地址相同,用
==
- 对象等价性:值相等,必须重写equals()和hashCode()
5 可变对象的观察等价性、行为等价性
-
观察等价性:在不改变状态的前提下,两个可变对象是否看起来一致
-
行为等价性:调用对象的任何方法都展示出一致的结果
-
对可变类型,实现行为等价性即可
- 即只有指向同样内存空间的object,才算相等的
- 对于可变数据类型来说,不需要重写equals和hashcode方法,直接继承即可
- 如果要判断两个可变对象看起来是否一致,最好重新定义一个方法。