hashCode方法在Object类中定义如下:
public native int hashCode();
说明是一个本地方法,其实现和本地机器相关。我们可以在自己的类中覆盖hashCode方法。
下面String类中重写的hashCode方法:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
}
hash = h;
}
return h;
}
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
下面是重写hashCode方法的例子:
public class Action
{
private String deviceMacAddr;
private String attribute;
private String operation;
private String value;
{
private String deviceMacAddr;
private String attribute;
private String operation;
private String value;
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((attribute == null) ? 0 : attribute.hashCode());
result = prime * result + ((deviceMacAddr == null) ? 0 : deviceMacAddr.hashCode());
result = prime * result + ((operation == null) ? 0 : operation.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((attribute == null) ? 0 : attribute.hashCode());
result = prime * result + ((deviceMacAddr == null) ? 0 : deviceMacAddr.hashCode());
result = prime * result + ((operation == null) ? 0 : operation.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
}
几点说明:
1. equals()相等的两个对象,hashcode()一定相等;
2. equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。
2. equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。
3. hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。