怎么重写及应用equals()方法和hashCode()方法

发布时间:2023-04-08 16:24:20 作者:iii
阅读:160
开发者专用服务器限时活动,0元免费领! 查看>>

怎么重写及应用equals()方法和hashCode()方法

在Java编程中,equals()hashCode()是两个非常重要的方法,它们通常用于对象的比较和哈希表的操作。正确地重写和应用这两个方法对于确保程序的正确性和性能至关重要。本文将详细介绍如何重写和应用equals()hashCode()方法,并通过示例代码进行说明。

1. 为什么需要重写equals()hashCode()方法

在Java中,equals()方法用于比较两个对象是否相等,而hashCode()方法用于返回对象的哈希码。默认情况下,equals()方法比较的是对象的引用,即两个对象是否指向同一个内存地址。而hashCode()方法则返回对象的内存地址的哈希码。

然而,在实际应用中,我们通常需要根据对象的某些属性来判断它们是否相等,而不是仅仅比较它们的引用。例如,对于两个Person对象,我们可能希望根据它们的nameage属性来判断它们是否相等。这时,我们就需要重写equals()方法。

同样地,hashCode()方法也需要重写,因为hashCode()方法的结果会影响对象在哈希表中的存储和查找。如果两个对象通过equals()方法判断为相等,那么它们的hashCode()方法必须返回相同的值。否则,哈希表将无法正确地存储和查找这些对象。

2. 重写equals()方法

2.1 equals()方法的基本规则

在重写equals()方法时,必须遵循以下规则:

  1. 自反性:对于任何非空引用xx.equals(x)必须返回true
  2. 对称性:对于任何非空引用xy,如果x.equals(y)返回true,那么y.equals(x)也必须返回true
  3. 传递性:对于任何非空引用xyz,如果x.equals(y)返回true,且y.equals(z)返回true,那么x.equals(z)也必须返回true
  4. 一致性:对于任何非空引用xy,如果x.equals(y)返回true,那么在对象没有被修改的情况下,多次调用x.equals(y)必须始终返回true
  5. 非空性:对于任何非空引用xx.equals(null)必须返回false

2.2 重写equals()方法的步骤

在重写equals()方法时,可以按照以下步骤进行:

  1. 检查是否为同一个对象:如果两个对象是同一个对象,直接返回true
  2. 检查是否为null:如果传入的对象为null,返回false
  3. 检查类型是否相同:如果传入的对象与当前对象的类型不同,返回false
  4. 比较属性:根据对象的属性进行比较,如果所有属性都相等,返回true,否则返回false

2.3 示例代码

以下是一个Person类的equals()方法的重写示例:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        // 1. 检查是否为同一个对象
        if (this == obj) {
            return true;
        }

        // 2. 检查是否为null
        if (obj == null) {
            return false;
        }

        // 3. 检查类型是否相同
        if (getClass() != obj.getClass()) {
            return false;
        }

        // 4. 比较属性
        Person other = (Person) obj;
        if (age != other.age) {
            return false;
        }
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }

        return true;
    }
}

在这个示例中,我们首先检查两个对象是否是同一个对象,然后检查传入的对象是否为null,接着检查两个对象的类型是否相同,最后比较nameage属性。

3. 重写hashCode()方法

3.1 hashCode()方法的基本规则

在重写hashCode()方法时,必须遵循以下规则:

  1. 一致性:在对象没有被修改的情况下,多次调用hashCode()方法必须返回相同的值。
  2. 相等性:如果两个对象通过equals()方法判断为相等,那么它们的hashCode()方法必须返回相同的值。
  3. 不等性:如果两个对象通过equals()方法判断为不相等,它们的hashCode()方法可以返回相同的值,但为了提高哈希表的性能,最好返回不同的值。

3.2 重写hashCode()方法的步骤

在重写hashCode()方法时,可以按照以下步骤进行:

  1. 选择一个初始值:通常选择一个质数作为初始值,例如17。
  2. 计算属性的哈希码:对于每个参与equals()方法比较的属性,计算其哈希码,并将结果与初始值进行组合。
  3. 返回最终的哈希码:将组合后的结果作为最终的哈希码返回。

3.3 示例代码

以下是一个Person类的hashCode()方法的重写示例:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
}

在这个示例中,我们选择了31作为初始值,然后计算agename属性的哈希码,并将它们与初始值进行组合,最终返回组合后的结果。

4. equals()hashCode()方法的应用

4.1 在集合中的应用

equals()hashCode()方法在集合类中有着广泛的应用,特别是在HashSetHashMap等基于哈希表的集合中。这些集合类依赖于equals()hashCode()方法来判断对象是否相等,并决定对象在集合中的存储位置。

例如,在HashSet中,当我们向集合中添加一个对象时,HashSet会首先调用该对象的hashCode()方法来确定对象的存储位置。如果该位置已经存在对象,HashSet会调用equals()方法来比较这两个对象是否相等。如果相等,则不会添加新对象;如果不相等,则会将新对象添加到集合中。

4.2 示例代码

以下是一个使用HashSet的示例代码:

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Person> people = new HashSet<>();

        Person person1 = new Person("Alice", 25);
        Person person2 = new Person("Bob", 30);
        Person person3 = new Person("Alice", 25);

        people.add(person1);
        people.add(person2);
        people.add(person3);

        System.out.println("Number of people: " + people.size());
    }
}

在这个示例中,我们创建了一个HashSet,并向其中添加了三个Person对象。由于person1person3nameage属性相同,因此它们被认为是相等的对象,HashSet只会保留其中一个对象。最终,HashSet中只包含两个对象。

4.3 在自定义类中的应用

在实际开发中,我们经常需要自定义类,并在这些类中重写equals()hashCode()方法。例如,假设我们有一个Employee类,它包含idnamedepartment属性。我们希望根据id属性来判断两个Employee对象是否相等。

以下是一个Employee类的示例代码:

public class Employee {
    private int id;
    private String name;
    private String department;

    public Employee(int id, String name, String department) {
        this.id = id;
        this.name = name;
        this.department = department;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Employee other = (Employee) obj;
        return id == other.id;
    }

    @Override
    public int hashCode() {
        return id;
    }
}

在这个示例中,我们根据id属性来判断两个Employee对象是否相等,并返回id作为哈希码。

5. 常见问题及注意事项

5.1 equals()hashCode()方法的一致性

在重写equals()hashCode()方法时,必须确保它们的一致性。也就是说,如果两个对象通过equals()方法判断为相等,那么它们的hashCode()方法必须返回相同的值。否则,哈希表将无法正确地存储和查找这些对象。

5.2 避免使用可变属性

在重写equals()hashCode()方法时,应尽量避免使用可变属性。如果使用可变属性作为判断对象相等的依据,那么在对象被修改后,equals()hashCode()方法的结果可能会发生变化,从而导致哈希表无法正确地存储和查找对象。

5.3 使用工具类简化代码

在重写equals()hashCode()方法时,可以使用一些工具类来简化代码。例如,java.util.Objects类提供了equals()hashCode()方法的实现,可以帮助我们更方便地重写这些方法。

以下是一个使用Objects类的示例代码:

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return age == other.age && Objects.equals(name, other.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

在这个示例中,我们使用了Objects.equals()方法来比较name属性,并使用Objects.hash()方法来计算哈希码。这样可以简化代码,并减少出错的可能性。

6. 总结

正确地重写和应用equals()hashCode()方法对于确保程序的正确性和性能至关重要。在重写这两个方法时,必须遵循它们的基本规则,并确保它们的一致性。通过合理地使用工具类,可以简化代码并减少出错的可能性。希望本文能够帮助读者更好地理解和应用equals()hashCode()方法。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. 怎么在python中对dataframe时间字段进行处理
  2. python如何调用API实现智能回复机器人

开发者交流群:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://blog.csdn.net/qq_40734247/article/details/102904797

hashcode() equals()

上一篇:k8s容器互联flannel vxlan通信原理是什么

下一篇:vue中的v-show,v-if,v-bind怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
开发者交流群×