文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、等价关系
等价关系需要满足三个性质,自反性、对称性、传递性。(集合论图论学过)
二、引用等价性和对象等价性
1、引用等价性 ==:
==
既可以判断基本数据类型又可以判断引用类型。
对于基本数据类型,==
用来判断值是否相等。
对于引用类型,==
比较的是地址是否相同。
2、对象等价性equals:
equals
是Object类中的方法,只能判断引用类型,默认是判断地址是否相等(因为在Object类中,实现使用的是==),子类中往往重写该方法,用来比较内容是否相等。如下所示:
public boolean equals(Object that) {
return this == that;
}
三、hashCode()方法
未重写时
两个引用如果指向同一个对象,则哈希值肯定是一样的。
两个引用如果指向不同对象,则哈希值是不一样的。
哈希值主要是根据地址号来的,不能完全将哈希值等价于地址
1、对于不可变类型
不可变类型
需同时重写equals()和hashcode(),保证行为等价性,行为等价性等价于观察等价性
。
equals()应该比较抽象值是否相等。这和equals()比较行为等价性是一样的。
hashcode()应该将抽象值映射为整数。
2、对于可变类型
可变类型
不需要重写equals()和hashCode(),保证行为等价性。
调用的是Object类的equals()方法,其实现上面说过了,是使用的==来判断引用是否相等。
四、观察等价性和行为等价性
1、观察等价性:
在不改变状态的情况下,两个mutable对象是否看起来一致。即通过只调用observer,producer和creator中的方法,它测试的是这两个索引在当前程序状态下“看起来”相等。
2、行为等价性:
调用对象的任何方法都展示出一致的结果。
总结
本文介绍了equals()和hashCode()方法,总结了可变类型和不可变类型的等价性。