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

文章目录

  • 一、等价关系
  • 二、引用等价性和对象等价性
      • 1、引用等价性 ==:
      • 2、对象等价性equals:
  • 三、hashCode()方法
      • 1、对于不可变类型
      • 2、对于可变类型
  • 四、观察等价性和行为等价性
      • 1、观察等价性:
      • 2、行为等价性:
  • 总结


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

一、等价关系

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

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

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

你可能感兴趣的:(软件构造,java)