【软件构造】equals()、hashCode()及引用等价性、对象等价性、观察等价性、行为等价性


提示:以下是本篇文章正文内容,下面案例可供参考

一、等价关系

等价关系需要满足三个性质,自反性、对称性、传递性。(集合论图论学过)

二、引用等价性和对象等价性

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()方法,总结了可变类型和不可变类型的等价性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值