其他分享
首页 > 其他分享> > 要重写Object中的equals(Object obj)方法的应有姿势是这样的!附带代码演示

要重写Object中的equals(Object obj)方法的应有姿势是这样的!附带代码演示

作者:互联网

大家都知道Object类是Java中所有类的超类(老祖宗类),并且它是java中唯一一个没有父类的类。它为它的子民们提供了9个方法,所有直接、间接子类都可以使用它们,其中:

  1. 允许子类直接使用、但是不允许子类重写的方法有:getClass();notify();notifyAll();wait() 四个方法;
  2. 允许子类直接使用、允许子类重写的方法有:toString();equals();hashCode();clone();finalize();五个方法;
    今天我们在这里就说说equals()方法的重写的正确姿势应该啥样!以下引入本人给新人授课的部分PPT页面作为辅助说明的资料吧!
    在这里插入图片描述这里:c1.equals(c2); 的结果应该是true;
    在这里插入图片描述这插个曲简明的给大家介绍说明以下“==”与equals()方法的区别与联系:
    在这里插入图片描述接下来,我们要严肃的说说equals()方法重写的约定了:
    在这里插入图片描述要重写equals()方法,咱还得了解了解哈希码是什么:
    在这里插入图片描述说白了它就是一段数据、信息,经过一个算法计算后得出的一个整数值(实际就是哈希码);在基于哈希存储数据的集合或容器中,我们能够通过哈希码获取数据、并且效率也比较高。
    要想重写的equals()方法在反复使用过程中不出乱子、给自己制造混乱、混淆,那么我们还是必须要重写hashCode()方法的:
    在这里插入图片描述那么到底应该如何重写一个不算复杂、而又有效的hashCode()方法来配合equals()方法的重写呢!?下面上代码吧!
    案例说明一下,我们打算比较两个Computer类型的对象,不再默认使用继承自Object类的原生equals()方法了、也就是不去比较这两个对象的地址了,而是共同认同这样一个规则:只要这两个Computer类型的实例c1和c2的name、screenSize、cup_freq三个属性值相同,就认为它们俩是同一个Computer对象:
public class Computer{
	private String name;
	private double screenSize;
	private double cpu_freq;
	@Override
	public boolean equals(Object obj){
		boolean result = false;
		if(this == obj){
			result == true;
		}
		if(obj instanceof Computer){   //照妖镜照一下传入的对象是啥类型
			Computer c = (Computer)obj;//向下转型
			if(c.name.equals(this.name)&&
				c.screenSize==this.screenSize&&
				c.cpu_freq==this.cpu_freq){
				result == true;
			}
		}
		return result;
	}
  @Override
  public int hashCode(){
  	int hash = 44;//可随意定义一个整数
  	int code = 0;
  	long longBits = Double.doubleToLongBite(screenSize);
  	code = (int)(longBits^(longBits>>>32));
  	code += name  == null ? 0 : 1;
  	code += cpu_freq  == null ? 0 :1;
  	hash = hash * 76 +code;   //76这个数字也可以随意取一个整数即可
  	return hash;
  }
  public Computer(String name,double screenSize,double cpu_freq){
	this.name = name;
	this.screenSize = screenSize;
	this.cpu_freq = cpu_freq;
  }
}

以上是定义了一个类:Computer。其中重写了equals()方法、并同时重写了hashCode()方法。
我们测试一下、并看看各自的结果如何:
在这里插入图片描述结果如下:在这里插入图片描述我们换一下数据、再测试运行一下,看看结果:
在这里插入图片描述结果如下:在这里插入图片描述以上希望对大家有用!以上不局限于此一种写法,还有其他几种写法的选择,仁者见仁智者见智,集思广益,互通有无,共同进步吧!
咕嘟咖啡的杨老师的技术课堂:第二篇-Java面向对象编程
咕嘟咖啡杨老师的技术课堂:第三篇-Java编程语言高级特性
咕嘟咖啡杨老师的技术课堂:JavaSE-JavaWeb课程项目实战演练
咕嘟咖啡杨老师的技术课堂:第一篇-Java编程语言基础

标签:obj,name,Object,equals,Computer,screenSize,freq,重写
来源: https://blog.csdn.net/jeep_patriot/article/details/106972689