伪原创嵌入网站,网站建设招聘需求,免费源码网站天,北京广告设计公司在 Java 中#xff0c;hashcode 和 equals 方法是 Object 类的两个重要方法#xff0c;它们在处理对象比较和哈希集合#xff08;如 HashMap、HashSet#xff09;时起着关键作用。对于equals大部分Java程序员都不陌生#xff0c;它通常是比较两个对象的内容(值)是否相等(双…在 Java 中hashcode 和 equals 方法是 Object 类的两个重要方法它们在处理对象比较和哈希集合如 HashMap、HashSet时起着关键作用。对于equals大部分Java程序员都不陌生它通常是比较两个对象的内容(值)是否相等(双等于比较对象的内存地址)如果是Object中的equals方法默认就是比较内存地址(在没有被重写的情况下和一样)。
hashCode 方法返回对象的哈希值。哈希码是一个整数值主要用于在哈希表如 HashMap、HashSet中快速定位对象。hashcode的值默认由JVM使用随机数生成的。
使用哈希码值的目的是为了判断元素是否存在哈希表中如果使用equals来查询效率会很低。如果哈希表中没有这个对象对应的hashcode值那么就可以确定这个对象在哈希表中不存在存入到哈希表中如果存在相同的hashcode值就调用equals方法与新的元素进行比较相同就直接覆盖不相同就散列到其他的地址。
默认实现Object 类中的 hashCode 方法基于对象的内存地址生成哈希码。重写原则当重写 equals 方法时通常也需要重写 hashCode 方法。这是因为在哈希集合中首先会根据对象的哈希码值来确定对象所在的桶bucket然后再使用 equals 方法来确定桶内的具体位置。如果两个对象通过 equals 方法比较相等但它们的 hashCode 方法返回不同的值那么在哈希集合中这两个对象可能会被存储在不同的位置导致哈希集合无法正确工作。
重写 hashCode 方法的一般原则是
如果两个对象通过 equals 方法比较相等那么它们的 hashCode 方法必须返回相同的值。如果两个对象通过 equals 方法比较不相等它们的 hashCode 方法返回的值不一定不同但尽量使不同对象的哈希码值分散以提高哈希表的性能。
简而言之两个对象equals相等那么hashcode一定相等两个对象equals不相等hashcode可有可能相等这个就称为哈希冲突。解决哈希冲突通常使用线性探测或者二次探测这里就不具体展开了。
public class Person {private String name;private int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic int hashCode() {return Objects.hash(name, 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);}
}
在上述 Person 类的例子中hashCode 方法使用 Objects.hash 方法根据 name 和 age 字段生成哈希码确保了相等的 Person 对象具有相同的哈希码。这样在使用哈希集合存储 Person 对象时能保证数据的一致性和高效访问。
需要注意的是当我们重写equals() 方法就一定要重写hashCode()方法因为如果我们只重写equals方法就有可能导致hashcode不相同这样就会导致这个类无法和所有的集合类一起工作。