您的位置:首页 > 健康 > 养生 > 搜狗推广下架_游戏开发巨头_贴吧引流推广_凡客建站

搜狗推广下架_游戏开发巨头_贴吧引流推广_凡客建站

2024/12/23 16:16:05 来源:https://blog.csdn.net/MaxCosmos2001/article/details/144119912  浏览:    关键词:搜狗推广下架_游戏开发巨头_贴吧引流推广_凡客建站
搜狗推广下架_游戏开发巨头_贴吧引流推广_凡客建站

条目11:重写equals方法时应该总是重写hashCode方法

为什么要重写hashCode方法?

Java 的规范明确规定了hashCodeequals方法的关系,如果两个对象根据equals方法是相等的,那么它们的hashCode值必须相等。这个规定确保了在使用哈希相关的数据结构(如HashMapHashSet等)时,能够正确地工作。如果只重写了equals方法,而没有重写hashCode方法,就会导致程序在处理哈希集合时出现异常行为。

如果只重写equals会发生什么?

会出现问题的代码示例:

import java.util.HashSet;
import java.util.Objects;class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}// 注意:未重写hashCode方法@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + '}';}
}public class Main {public static void main(String[] args) {HashSet<Person> people = new HashSet<>();Person person1 = new Person("Alice", 25);Person person2 = new Person("Alice", 25);// 添加两个逻辑上相等的对象people.add(person1);people.add(person2);// 打印集合System.out.println(people);}
}

运行结果:

[Person{name='Alice', age=25}, Person{name='Alice', age=25}]

虽然person1person2在逻辑上是相等的(equals方法返回true),但由于hashCode未被重写,它们的哈希值是不同的(基于默认实现Object.hashCode)。因此,HashSet无法正确识别它们是同一个对象。

重写equalshashCode方法

class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + '}';}
}public class Main {public static void main(String[] args) {HashSet<Person> people = new HashSet<>();Person person1 = new Person("Alice", 25);Person person2 = new Person("Alice", 25);// 添加两个逻辑上相等的对象people.add(person1);people.add(person2);// 打印集合System.out.println(people);}
}

运行结果:

[Person{name='Alice', age=25}]

hashCode的实现原则

  1. 一致性原则。在同一程序执行期间,如果一个对象的状态没有改变,则其hashCode值必须始终一致。
  2. 相等性原则。如果两个对象根据equals方法是相等的,那么它们的hashCode值必须相等。
  3. 高效性原则。将对象尽可能均匀地分布在哈希表中,以减少哈希冲突。

实现方式:

  • 使用Objects.hash()方法,这是最简单的方式。

  • 手动组合关键字段,确保分布均匀。

    @Override
    public int hashCode() {int result = 17; // 初始值result = 31 * result + (name == null ? 0 : name.hashCode());result = 31 * result + age;return result;
    }
    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com