26

我应该如何在 Java 中实现hashCode()以下equals()类?

class Emp 
{
  int empid ; // unique across all the departments 
  String name;
  String dept_name ;
  String code ; // unique for the department 
}
4

6 回答 6

34

在 Eclipse 中右键单击-> 源代码-> 生成 hashCode() 和 equals() 给出了这个:

/* (non-Javadoc)
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (code == null ? 0 : code.hashCode());
    return result;
}
/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof Emp))
        return false;
    Emp other = (Emp) obj;
    return code == null ? other.code == null : code.equals(other.code);
}

我已选择代码作为唯一字段

于 2010-01-25T13:01:21.507 回答
4

试试这个代码,使用org.apache.commons.lang3.builder

public int hashCode() {
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
        append(empid).
        append(name).
        append(dept_name ).
        append(code ).
        toHashCode();
}

public boolean equals(Object obj) {

    if (obj == this)
        return true;
    if (!(obj instanceof Person))
        return false;

    Emp rhs = (Emp) obj;
    return new EqualsBuilder().
        // if deriving: appendSuper(super.equals(obj)).
        append(name, rhs.name).
        isEquals();
}
于 2014-09-02T01:31:00.007 回答
2

Guava 有创建它们的辅助方法。您告诉它要考虑哪些字段,它会为您处理空值并为哈希码进行质数计算。

IDE 还可以根据您选择的字段生成它们。

将其委托给这样的工具的好处是您可以获得标准解决方案,并且不必担心遍布整个项目的各种实现的错误和维护。

这是一个使用 Guava 并由 IntelliJ 插件生成的示例:https ://plugins.jetbrains.com/plugin/7244?pr=

于 2015-03-31T15:09:40.903 回答
0

如果代码是唯一的(即您的业务密钥),最好只将代码用于 equals 和 hashCode - 将业务密钥(代码)与对象 ID(ID)分开是一种很好的做法。

这是一篇不错的读物:Hibernate Documentation: Equals and HashCode(不仅对 Hibernate 本身有效)

于 2010-01-25T12:56:31.923 回答
-1

您在 equals 中使用什么值来确定两个对象是否相同,是您需要用来创建哈希码的值。

public boolean equals(Object o) {

    boolean result = false;

    if(o instanceof CategoryEnum) {

        CategoryEnum ce = (CategoryEnum) o;
        result = ce.toString().equals(name);

    }       
    return result;

}


public int hashCode()
{
  int hash = 6;
  hash += 32 * name.hashCode();
  return hash;
}   
于 2010-01-25T13:01:42.703 回答
-2

equals()和hashcode(),它们有很多不同的地方。equals(),如果我们不从Object中重写它,它表示两个变量是否指向同一个对象堆?

public  Class Student(){
  private int id;
  private  name;
  public Student(int id,String name){
  this.name=name;
  this.id=id; 
}

public void main(String[] args){
  Student A=new Student(20,'Lily');
  Student B=new Student(20,'Lily');
  boolean flag=A.equals(B)//flag=flase;
/*
 *Although they attribute the same, but they are two different objects, they point to     different memory
 */


@Override
public boolean equals(Object obj) {


  if (obj == null) {
    return false;
  }
  if (this == obj) {
    return true;
  }

  if (this.getClass() != obj.getClass()) {
    return false;
  }
  Student s=(Student)obj;
  return new Integer(this.id).equals(new Integer(s.id))&&this.name.equals(s.name);
  }

/**
  *Sometimes even though we Override  the equals, but we still can not determine whether   the *two objects the same,
  *In the collection object, such as HashSet, this time we have to Override the hashoCode ()
  */

public int hashCode(){
  return id + name.hashCode() ;
}
于 2010-01-25T14:07:36.260 回答