[英]What is use of hashCode() and equals() method in Java?
我對java沒有什么問題。 我無法得到准確的結果。 這段代碼有什么問題請幫我從這段代碼中將你自己的對象作為地圖或集合中的鍵。 使用您自己的對象作為映射或Sets.code中的鍵未正確執行..
什么是在java中使用hashcode和equals。
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return "{ID is: " + id + "; name is: " + name + "}";
}
}
public class App {
public static void main(String[] args) {
//creating person object
Person p1 = new Person(0, "Bob");
Person p2 = new Person(1, "Sue");
Person p3 = new Person(2, "Mike");
Person p4 = new Person(1, "Sue");
Map<Person, Integer> map = new LinkedHashMap<Person, Integer>();
//putting on map
map.put(p1, 1);
map.put(p2, 2);
map.put(p3, 3);
map.put(p4, 1);
//displaying the result
for(Person key: map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
//using set
Set<Person> set = new LinkedHashSet<Person>();
//adding on set
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
//displaying the result
System.out.println(set);
}
}
{ID is: 0; name is: Bob}: 1
{ID is: 1; name is: Sue}: 1
{ID is: 2; name is: Mike}: 3
[{ID is: 0; name is: Bob}, {ID is: 1; name is: Sue}, {ID is: 2; name is: Mike}]
Cfr hashCode的一般合約:
如果兩個對象根據equals(Object)方法相等,則對兩個對象中的每一個調用hashCode方法必須生成相同的整數結果。
equals()
和hashCode()
方法都在超類Object
。 在真正的worl應用程序中,您可能需要覆蓋這兩種方法,但除非您了解它們的實用程序,否則不要這樣做。 我會盡力做到最好:
equals()方法用於等價關系。 hashCode()用於提供一個哈希碼,它是一個32字節的對象表示。
想象一下,你有一個具有以下聲明的類Person
:
public class Person {
public int nationalIdentityNumber;
public String firstName;
public String secondName;
public Person (int nationalIdentityNumber, String firstName, String secondName) {
this.nationalIdentityNumber = nationalIdentityNumber;
this.firstName = firstName;
this.secondName = secondName;
}
}
不覆蓋equals()
方法時:
Person p1 = new Person(1234,"Jhon","Legend");
Person p1 = new Person(1234,"Mary","Richard");
當我們調用p1.equals(p2)
這將導致false
結果,因此Object
類的默認方法比較對象引用。 但我實際上你可能需要的是當他們的nationalIdentityNumber實例變量相等時,兩個人被認為是等於你需要覆蓋equals()
實現,如下所示:
@Override
public boolean equals(Object object) {
boolean result = false;
if (object == null || object.getClass() != getClass()) {
result = false;
} else {
Person person = (Person) object;
if (this.nationalIdentityNumber == person.nationalIdentityNumber) {
result = true;
}
}
return result;
}
所以p1.equals(p2)
現在將返回一個真實的結果。
現在回到hashCode
,假設您在HashSet
中注冊Person
對象
HashSet<Person> personsHS = new HashSet<Person>();
personsHS.add(p1);
personsHS.add(p2);
什么時候發出邀請
System.out.println("personsHS.contains( new Person(1234,Jhon,Legend))--->>>"+personsHS.contains(new Person(1234,"Jhon","Legend")));
它將導致personHS.contains(new Person(1234,“Jhon”,“Legend”))--- >>> false語句,因為HashSet使用默認的Object#hashCode()
方法來確定鍵的相等性我們需要覆蓋它以確保哈希表內的Person
唯一性(基於您的要求):
@Override
public int hashCode() {
return this.nationalIdentityNumber;
}
以便
System.out.println("personsHS.contains(new Person(1234,Jhon,Legend))--->>>"+personsHS.contains(new Person(1234,"Jhon","Legend")));
將導致personHS.contains(新人(1234,“Jhon”,“傳奇”))--- >>> true
這是最簡單的可能但是請注意,它總是取決於您的應用程序和您自己的對象是否要覆蓋此方法以及這樣做的方式。
BR。
在java中,要在某些功能中使用自己的對象,有時需要創建一些“通用”功能。 例如HashCode和Equals。
要像你一樣在hashmap中使用你的對象,java需要那些。 所以你必須在你的“人”類中實現它們。 這篇文章解釋了為什么在某些情況下我們需要覆蓋這些方法以及它們究竟在做什么:
http://javarevisited.blogspot.ca/2011/02/how-to-write-equals-method-in-java.html
通常,您可以使用IDE自動生成它們,在NetBeans中可以訪問:Source - Insert Code - Equals和Hashcode。
然后它應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.