繁体   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