您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页基础篇-重写equals和hashCode方法

基础篇-重写equals和hashCode方法

来源:叨叨游戏网

一、为什么要重写

在Java中,重写equals和hashCode方法是非常重要的,尤其是在以下几种情况下:
1.对象比较:
equals方法用于判断两个对象是否相等。默认情况下,Object类的equals方法是比较对象的引用是否相同。如果自定义了对象的相等条件(例如根据某些字段值来判断),则需要重写equals方法。
2.集合操作:
在使用集合类(如HashSet、HashMap、ArrayList等)时,equals和hashCode方法的正确实现非常重要。例如,HashSet依赖hashCode方法来确定对象的存储位置,而equals方法用于验证对象是否真正相等。
3.一致性:
为了保证equals和hashCode方法的一致性,即如果两个对象通过equals方法判断为相等,那么它们的hashCode值也必须相等。反之,如果两个对象的hashCode值不相等,那么它们一定不相等。
4.性能优化:
hashCode方法可以提高集合操作的性能。例如,在HashMap中,hashCode方法用于快速定位桶的位置,从而减少查找时间。

二、示例

1.假设我们有一个Person类,没有重写equals和hashCode方法

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

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{id=" + id + ", name='" + name + "'}";
    }
}

2.使用Person对象的集合示例

public class Test {
    public static void main(String[] args) {
        // 创建一些Person对象
        Person person1 = new Person(1, "Alice");
        Person person2 = new Person(1, "Alice");
        Person person3 = new Person(2, "Bob");

        // 使用HashSet
        Set<Person> set = new HashSet<>();
        set.add(person1);
        set.add(person2);
        set.add(person3);

        System.out.println("HashSet: " + set);

        // 使用List
        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);

        System.out.println("ArrayList: " + list);

        // 使用Map
        Map<Person, String> map = new HashMap<>();
        map.put(person1, "Value1");
        map.put(person2, "Value2");
        map.put(person3, "Value3");

        System.out.println("HashMap: " + map);
    }

}

3.输出结果如下

同理,在HashMap中person1和person2被视为不同的键,因此map.put(person2, "Value2")会成功添加到映射中,而不是覆盖person1的值。

4.Person类中重写equals和hashCode方法

方法一:IDEA快捷键:Alt+Insert 可快速生成

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

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

方法二:在Person类使用Lombok的 @EqualsAndHashCode注解

@EqualsAndHashCode
public class Person {
...
}

5.重写后再次运行结果如下

重写equals和hashCode方法后,对象在集合中的行为更加符合预期,能够正确地进行对象的比较和查找。这对于确保集合操作的正确性和性能至关重要。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务