ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-27 16:37:03  阅读:245  来源: 互联网

标签:obj name Object equals Computer screenSize freq 重写


大家都知道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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有