如何确保hashCode()与equals()一致?

当覆盖java.lang.Object的equals()函数时,javadocs建议,

通常,无论何时重写此方法,都必须重写hashCode方法,以维护hashCode方法的常规约定,该约定规定相等的对象必须具有相等的哈希码。

hashCode()方法必须为每个对象返回一个 (当根据内存位置比较对象时,这很容易做到,只需返回对象的 地址即可)

应该如何重写hashCode()方法,以便仅根据对象的属性为每个对象返回 ?

public class People{

public String name;

public int age;

public int hashCode(){

// How to get a unique integer based on name and age?

}

}

/*******************************/

public class App{

public static void main( String args[] ){

People mike = new People();

People melissa = new People();

mike.name = "mike";

mike.age = 23;

melissa.name = "melissa";

melissa.age = 24;

System.out.println( mike.hasCode() ); // output?

System.out.println( melissa.hashCode(); // output?

}

}

回答:

并不是说一个对象的哈希码必须完全唯一,只是两个相等对象的哈希码返回相同的哈希码。有两个不相等的对象返回相同的哈希码是完全合法的。但是,哈希码在一组对象上的分布越独特,您从HashMaps和其他使用hashCode的操作中获得的性能就越好。

像IntelliJ

Idea这样的IDE都具有用于equals和hashCode的内置生成器,这些生成器通常可以很好地为大多数对象提供“足够好”的代码(并且可能比某些手工制作的超灵巧哈希函数要好)。

例如,这是Idea为您的People类生成的hashCode函数:

public int hashCode() {

int result = name != null ? name.hashCode() : 0;

result = 31 * result + age;

return result;

}

以上是 如何确保hashCode()与equals()一致? 的全部内容, 来源链接: utcz.com/qa/405168.html

回到顶部