Object类的equals和hashCode方法

一、equals方法

  1. 简介:Object类中的equals方法用于判断一个对象是否等于另外一个对象(判断是否具有相同的引用),当实际开发中经常根据两个对象中的个别域来判断两个对象是否相同。

  2. 重写规则:

 1     public boolean equals(Object otherObj) {
 2         //检测this与otherObj是否引用同一个对象
 3         if (this == otherObj) {
 4             return true;
 5         }
 6         //检测otherObj是否为空
 7         if (otherObj == null) {
 8             return false;
 9         }
10
11         /*
12             注意:以下比较规则按实际情况二选一
13          */
14         //比较this与otherObj是否属于同一个类,如果equals的语义在每个子类中有所改变,就用getClass检测
15         if (this.getClass() != otherObj.getClass()) {
16             return false;
17         }
18         //如果所有的子类都拥有统一的语义,就用instanceof检测
19         if (!(otherObj instanceof Employee)) {
20             return false;
21         }
22
23         //类型强转,进行域比较
24         Employee employee = (Employee)otherObj;
25         return this.salary == employee.salary
26                 && Objects.equals(this.name, employee.name)  //如果用equals比较会发生一种情况:当比较双方都为null时返回true,故用Objects的equals方法
27                 && Objects.equals(this.hireDay, employee.hireDay);
28     }

  instanceof和getClass的选择:

    假设有e.equals(m),其中e为Employee的对象,m是一个Manager对象,两个对象具有相同的姓名,薪水,如果在Employee.equals中用instanceof进行检测,则返回true,然而反过来是返回false,但根据equals的对称性,必须返回true,故在这里不会考虑Manager特有的域,只会考虑公有域。在这个例子中,可以得出如果子类能够拥有自己的相等概念,则需要用getClass进行判断,例如两个Manager对象所对应的姓名,薪水,但奖金不同来判断二者对象不同;如果由超类决定相等的概念,那么就得用instanceof,例如使用Employee的ID。

  子类的重写规则(父类已经重写):

1     public boolean equals(Object otherObj) {
2         if (!super.equals(otherObj)) {
3             return false;
4         }
5         Manager manager = (Manager)otherObj;
6         return this.bonus == manager.bonus;
7     }

二、hashCode方法

   1. 简介:对象导出的一个整数值。

·    2. 重写规则:

1     public int hashCode() {
2         return 7 * Objects.hashCode(name)
3                 + 11 * Double.hashCode(salary)
4                 + 13 * Objects.hashCode(hireDay);
5     }

     或

1     public int hashCode() {
2         return Objects.hash(hireDay, name, hireDay);
3     }

   注意:1. 子类重写要加上super.hashCode()。2. equals与hashCode的定义必须一致,例如用定义的equals比较雇员的ID,那么hashCode方法就需要散列ID,而不是雇员的姓名等。

原文地址:https://www.cnblogs.com/chenloveslife/p/8646341.html

时间: 2024-10-14 14:35:07

Object类的equals和hashCode方法的相关文章

Object 类、equals、hashCode

Object 类:    Object 类是所又类的终极父类.任何一个类都继承了 Object 类. Object 常用方法: toString(); //返回该对象的字符串表示. 作用:重写toString方法,我们直接输出一个对象的时候,就会输出符合我们所需求的格式数据. equals(Object obj); //用于比较两个对象的内存地址,判断两个对象是否为同一个对象. hashCode(); //返回该对象的哈希码值(可以把哈希码理解成对象的内存地址) public Class Dem

Java提高篇——equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj)

如何编写出高质量的 equals 和 hashcode 方法?

什么是 equals 和 hashcode 方法? 这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object 中提供了 8 个基本的方法,equals 方法和 hashcode 方法就是其中的两个. equals 方法:Object 类中的 equals 方法用于检测一个对象是否等于另一个对象,在 Object 类中,这个方法将判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的.

关于Object类的equals方法和hashCode方法

关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为true: 3.传递性:x.equals(y)为true,y.equals(z)为true,那么x.equals(z)也为true: 4.一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次,第三次,...,第n次调用也为true,前提条件是在比较之间没有修改x,也没

Java Object类及其equals方法

基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.可以使用类型为Object的变量指向任意类型的对象 equals()方法:比较两个对象是否同一       如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等.如果两个引用对象指的是同一个对像,则称这两个变量同一.Object类中定义的equa

Java Object类的equals()方法

所有类都从Object类中继承了equals方法,Object类中equals方法源代码如下: public boolean equals(Object obj)     {         return this == obj;     } Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的是同一块内存对象,则返回true,如果th

【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址

集合框架比较两个对象是否相同(equals和hashCode方法)

package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思义,底层采用了哈希表算法. * * 在HashSet中如何判断两个对象是否是否相等问题分析: * 1. 要用两个对象的equals方法比较,返回true说明对象相同. * 2. 两个对象的hashCode方法返回值相同. * * 对象hashCode决定了在哈希表中的存储位置. * * 向HashS

Java中的equals和hashCode方法

本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复.这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的h