簡體   English   中英

Java中hashCode()和equals()方法的用途是什么?

[英]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")));

它將導致personH​​S.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")));

將導致personH​​S.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM