高质量equals方法和HashCode

equals方法

  1. 使用==操作符检查“参数是否为当前对象的引用”,如果是,直接返回true;
  2. 使用instanceof 操作符检查“参数是否为正确的类型”。如果不是,直接返回false。(根据具体逻辑,此处可能需要使用==判断class);
  3. 将参数转换为正确的类型;
  4. 对于该类中的每个“关键”域,检查参数中的域是否与该对象中的鱼相匹配。对于既不是float和double类型的基本类型域,使用==比较;对于对象引用域,使用equals方法;对于float域,使用Float.compare;对于double域,使用Double.compare

注意点:

  • 覆盖equals时,总要覆盖hashcode;
  • 不要将equals(Object obj) 中的Object参数类型替换为其他的类型。

hashCode方法的散列函数:

    1. 把某个非零的常数值,比如17,保存在一个名为result的int类型变量中;
    2. 对于对象中的每个关键域f(指equals方法中涉及的每个域),完成以下步骤:
      1. 为该域计算int类型的散列码c:
        1. 如果该域是boolean类型,则计算(f?1:0);
        2. 如果该域是byte、short、char或者int类型,则计算(int)f;
        3. 如果该域是long类型,则计算(int)(f^(f>>>32));
        4. 如果该域是float类型,则计算Float.floatToIntBits(f);
        5. 如果该域是double类型,则计算Double.doubleToLongBits(f),然后按照步骤2.1.3,为得到的long类型计算散列值;
        6. 如果该域是一个对象引用,并且该类的equals方法通过递归的调用equals方式比较这个域,则通用为这个域递归的调用hashCode。
        7. 如果该域是一个数组,则要把每个元素当做单独的域来处理。
      2. 按照下面的公式,把步骤2.1中计算得到的散列码c合并到result中:
        result = 31*result + c;
    3. 返回result
时间: 2024-10-13 23:00:03

高质量equals方法和HashCode的相关文章

详解equals()方法和hashCode()方法

前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. 一.equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实现

HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法

import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(String[] args) { /* *对于用户自定义类型的数据放在容器(Set)中 *务必重写equals和hashCode方法 *要不然stu1和stu2放在容器中,和认为是两个不同的元素 **/ //set中存放的元素是无序的 //set中存储的元素是不可以重复的(根据equals方法和hashCod

关于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正确地自定义比较对象---如何重写equals方法和hashCode方法

在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { private String province; private String city; public String getProvince() { return province; } public void setProvince(String province) { this.province = p

重写equals()方法和 hashCode()方法

java中判断两个对象是否相等的规则:首先,判断两个对象的hashCode是否相等 如果不相等,认为两个对象也不相等 如果相等,则判断两个对象用equals运算是否相等 如果不相等,认为两个对象也不相等 如果相等,认为两个对象相等 我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率. equals()相等的两个对象,hashcode()一定相等: equals()不相等的两个对象,却并不能证明他们的hashcode()不相等. 1,所有Java类都继承自O

Java重写equals方法和hashCode方法

package com.ddy; public class User {     private Integer id; private String name; private String address; private String phone; public Integer getId() {         return id;     } public void setId(Integer id) {         this.id = id;     } public Strin

编写高质量equals方法

什么是equals方法 指示其他某个对象是否与此对象相等,equals方法存在Object类中,我们编写的类继承Object,可以覆盖Object的equals方法来实现我们的逻辑,去判断两个对象是否相等. Object类中的equals方法 一起来看看Object类中的源代码 public boolean equals(Object obj) { return (this == obj); } 我们可以观察到几点: equals方法是public修饰的,外部类是可以访问的 equals方法的返

Java提高篇——equals()方法和“==”运算符

阅读目录 equals() equals()方法和"=="运算符比较 回到顶部 equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { return (this == obj); } 我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时"=="比较两个对象的的内存地址,所以说使用Object的equals()方法是比较两个对

java中equals方法和“==”的比较

equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变量本身的值,即两个对象在内存中的首地址. “equals()”比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"); s2 = new St