要重写Object中的equals(Object obj)方法的应有姿势是这样的!附带代码演示
作者:互联网
大家都知道Object类是Java中所有类的超类(老祖宗类),并且它是java中唯一一个没有父类的类。它为它的子民们提供了9个方法,所有直接、间接子类都可以使用它们,其中:
- 允许子类直接使用、但是不允许子类重写的方法有:getClass();notify();notifyAll();wait() 四个方法;
- 允许子类直接使用、允许子类重写的方法有: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