hashCode()
는 해시 코드라고도 불리는 해시 코드를 얻는 데 사용됩니다. 이 코드는 실제로 int 정수를 반환합니다. 이 해시 코드의 목적은 해시 테이블에서 개체의 인덱스 위치를 결정하는 것입니다. hashCode()
的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode()
定义在JDK的Object.java中,这就意味着Java中的任何类都包含有 hashCode()
函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)。
在我们编写程序的过程中,判断两个对象是否相同是十分常见且经常面对的一个问题。而 hashCode()
方法就是用来提升比较两个对象的速度的。
我们就以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
当你把对象加入 HashSet
时,HashSet 会先计算对象的 hashcode
值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode
值作比较,如果没有相符的 hashcode
, HashSet
会假设对象没有重复出现。
但是如果发现有相同 hashcode
值的对象,这时会调用 equals()方法来检查 hashcode
相等的对象是否真的相同。如果两者相同, HashSet
就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
这样我们就大大减少了 equals
的次数,相应就大大提高了执行速度。
Java 对于 eqauls() 方法和 hashCode() 方法是这样规定的:
同一对象上多次调用 hashCode() 方法,总是返回相同的整型值。
如果 a.equals(b),则一定有 a.hashCode() 一定等于 b.hashCode()。
如果 !a.equals(b),则 a.hashCode() 不一定等于 b.hashCode()。此时如果 a.hashCode() 总是不等于 b.hashCode(),会提高 hashtables 的性能。
a.hashCode()==b.hashCode() 则 a.equals(b) 可真可假
a.hashCode()!= b.hashCode() 则 a.equals(b) 为假。
上面结论简记:
如果两个对象 equals,Java 运行时环境会认为他们的 hashCode 一定相等。
如果两个对象不 equals,他们的 hashCode 有可能相等。
如果两个对象 hashCode 相等,他们不一定 equals。
如果两个对象 hashCode 不相等,他们一定不 equals。
我们上面讲解到 如果 两个对象 equals
的话,那么它们的 hashCode
值必然相等。如果只重写了 equals
方法,而不重写 hashCode
的方法,会造成 hashCode
的值不同,而 equals
方法判断出来的结果为true
。
在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。这时候如果只重写了 equals
的方法,而不重写 hashCode
的方法,Object中 hashCode
是根据对象的存储地址转换而形成的一个哈希值。这时候就有可能因为没有重写 hashCode
hashCode()
는 JDK의 Object.java에 정의되어 있습니다. 즉, Java의 모든 클래스에는 hashCode()
함수가 포함되어 있습니다.
해시 테이블은 키-값 쌍을 저장하며, "키"에 따라 해당 "값"을 빠르게 검색할 수 있다는 것이 특징입니다. 이것은 해시 코드를 사용합니다! (필요한 물건을 빠르게 찾을 수 있습니다.)
2. hashCode 메소드가 필요한 이유는 무엇인가요? 🎜🎜🎜프로그램을 작성하는 과정에서 두 객체가 동일한지 판단하는 것은 매우 흔하고 자주 직면하는 문제입니다.
hashCode가 필요한 이유를 설명하기 위해 "HashSet에서 중복을 확인하는 방법"을 예로 들어 보겠습니다.hashCode()
메서드는 두 객체를 비교하는 속도를 향상시키는 데 사용됩니다.
HashSet
에 개체를 추가하면 HashSet이 먼저 를 계산합니다. 개체 /code> 값의 hashcodehashcode
값과 비교합니다. >hashcode, HashSet
는 객체가 반복되지 않는다고 가정합니다. 🎜🎜🎜🎜그러나 동일한 hashcode
값을 가진 객체가 발견되면 hashcode
동일한 객체가 실제로 동일한지 확인하기 위해 equals() 메서드가 호출됩니다. 둘이 동일한 경우 HashSet
는 조인 작업의 성공을 허용하지 않습니다. 다른 경우 다른 위치로 다시 해시됩니다. 🎜🎜🎜🎜이러한 방식으로 equals
수를 크게 줄이고 그에 따라 실행 속도를 크게 높입니다. 🎜🎜🎜🎜3. 두 메소드 hashCode()와 equals() 사이의 관계는 무엇입니까?🎜🎜Java에서는 eqauls() 메소드와 hashCode() 메소드를 다음과 같이 규정합니다. 🎜🎜🎜🎜해시 코드(를 여러 번 호출) 동일한 객체) 메서드는 항상 동일한 정수 값을 반환합니다. 🎜🎜🎜🎜a.equals(b)인 경우 a.hashCode()는 b.hashCode()와 동일해야 합니다. 🎜🎜🎜🎜!a.equals(b)인 경우 a.hashCode()가 반드시 b.hashCode()와 같지는 않습니다. 이때 a.hashCode()가 항상 b.hashCode()와 같지 않으면 해시테이블의 성능이 향상됩니다. 🎜🎜🎜🎜a.hashCode()==b.hashCode() 그러면 a.equals(b)는 true 또는 false가 될 수 있습니다🎜🎜🎜🎜a.hashCode()! = b.hashCode()이면 a.equals(b)는 거짓입니다. 🎜🎜🎜🎜위 결론의 축약: 🎜🎜🎜🎜두 개체가 동일하면 Java 런타임 환경은 해당 hashCode가 동일해야 한다고 생각합니다. 🎜🎜🎜🎜두 객체가 동일하지 않은 경우 해당 해시코드는 동일할 수 있습니다. 🎜🎜🎜🎜두 객체의 hashCode가 동일하다고 해서 반드시 동일할 필요는 없습니다. 🎜🎜🎜🎜두 개체의 hashCode가 동일하지 않은 경우 동일해서는 안 됩니다. 🎜🎜🎜🎜4. 왜 equals 메서드를 재정의하면 hashcode 메서드를 재정의해야 합니까? 🎜🎜🎜🎜위에서 두 개체가 같으면
이면 해당 hashCode
값도 같아야 한다고 설명했습니다. hashCode
메서드를 재정의하지 않고 equals
메서드만 재정의하면 hashCode
의 값이 달라지며 equals 메소드에 의해 결정된 값은 <code>true
입니다. 🎜🎜🎜🎜Java의 일부 컨테이너에서는 두 개의 동일한 객체를 삽입할 때 동일한 것으로 판단되면 덮어쓰게 됩니다. 이때 hashCode
메소드를 다시 작성하지 않고 equals
메소드만 다시 작성하면 Object의 hashCode
가 저장 주소를 기준으로 변환됩니다. 그리고 해시 값을 형성합니다. 이때, hashCode
메소드가 오버라이드되지 않아 동일한 객체가 다른 위치로 해싱되어 객체를 덮어쓸 수 없는 문제가 발생할 수 있습니다. 🎜🎜🎜🎜예를 들어🎜🎜Dog 클래스🎜package com.xiao; /** * @author :小肖 * @date :Created in 2022/3/11 14:42 */ public class Dog { private String name; private Integer age; public Dog() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Dog(String name, Integer age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if(obj.getClass() != getClass()){ return false; } Dog dog = (Dog) obj; if(dog.getAge() == age && dog.getName().equals(name)){ return true; } return false; } }🎜테스트 클래스🎜
import com.xiao.Dog; public class Test { public static void main(String[] args) { Dog dog = new Dog("小旺",2); Dog dog1 = new Dog("小旺",2); System.out.println("equals结果:" + dog.equals(dog1)); System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode())); } }🎜테스트 결과🎜🎜🎜결과와 같음: true🎜dog의 hashCode 값이 dog1의 hashCode 값과 같은지 여부: false🎜🎜
위 내용은 Java에서 hashCode 메소드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!