Java equals() hashCode() 用法

来源:互联网 发布:淘宝上的彩妆正品店 铺 编辑:程序博客网 时间:2024/05/16 23:35

java的超类java.lang.Object 有两个非常重要的方法定义:

public boolean equals(Object obj)public int hashCode()

理解他们是及其重要的,特别是当用户自定义的objects添加到Maps的时候,但是有些高水平的开发者有时候也不明白怎么恰当的使用它们,在这篇文章中,我会首先给出一个常见的错误的例子,然后解释equals()和hashcode()是如何工作的。

一个常见的错误

在下边这个例子中体现:
import java.util.HashMap; public class Apple {private String color; public Apple(String color) {this.color = color;} public boolean equals(Object obj) {if (!(obj instanceof Apple))return false;if (obj == this)return true;return this.color.equals(((Apple) obj).color);} public static void main(String[] args) {Apple a1 = new Apple("green");Apple a2 = new Apple("red"); //hashMap stores apple type and its quantityHashMap<Apple, Integer> m = new HashMap<Apple, Integer>();m.put(a1, 10);m.put(a2, 20);System.out.println(m.get(new Apple("green")));}}

在这个例子中,绿苹果对象成功存储在HashMap中,但是当重新取出这个对象时,这个对象却找不到了,上边的程序打印的是null,但是我们可以肯定的是这个对象已经存储在hashmap中了。

由hashCode()导致的问题

这个问题是有没有重写hashCode()导致的,equals()和hashCode()之间的规则是:
1、如果两个对象是相等的,那么他们必须具有相同的 hash code。
2、如果两个对象有相同的hash code,他们或许并不相等。
Map的思想是查找对象要比线性查找更快,使用hashed keys 来定位需要查找的对象需要两步。Map的内部存贮以二维数组的形式类似的方式存储对象,第一个数组的索引是key的hashcode()之后的值。对第二个层数组的查找是利用equals()进行线性比较来确定对象是否存在。
对象中默认实现的hashcode()对不同的对象返回不同的整数。因此,在上边的例子中,不同的对象(即使是相同的类型)都有不同的hashCode()。
hash code 就像是一对需要存储的货物,不同的货物存储在不同的仓库中。与放在同一个仓库相比,不同的货物放在不同的仓库中显然更高效。所以平均的分配hashcode是很好的习惯。(虽然这不是主要的观点)

解决的方法是增加hashCode方法,这里我只增加了color的长度来作为一个演示

public int hashCode(){return this.color.length();}


原文链接:http://www.programcreek.com/2011/07/java-equals-and-hashcode-contract/


1 0