Thinking in Java之hashCode()方法
一直对hashCode()这个方法由困惑,也不知道什么时候该去实现hashCode()方法。趁着研究
源码的这段时间吧hashCode()方法做一个总结。
HashCode返回值
Java中每个对象都是Object的子类,也就用于hashCode()方法,查看源码可以知道,hashCode()
方法返回的是一个整数,这有什么实际含义吗?
其实hashCode()方法返回的是对象的哈希码,那么对象的哈希码又是个什么东东?
简单的来书对象的哈希码代表了对象的特征。对象的特征有阵各种的表现形式,例如对象的物理
地址,字符串内容,或者数字算出来的int类型的数值。哈希码既然用于表示对象的特征,就可以
用于判断对象是否相等,所以在实际情况下如果对象通过equals方法是相等的,那么其hashCode
返回的值也是相等的。例如String类。
[java]
package com.kiritor;
public class HashTest {
public static void main(String[] args) {
String a = "AAA";
String b ="AAA";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
package com.kiritor;
public class HashTest {
public static void main(String[] args) {
String a = "AAA";
String b ="AAA";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
两句Sysout语句输出的结果都是一样的!Object的hashCode()方法其实就是根据对象的物理地
址生成的hash值,Object的equals方法判断的也是物理地址。这里由于Object的hashCode方法是
native的我们就解析下String 类的hashCode的源码吧:
[java]
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
可以看见的是String的hashCode就是根据字符串的内容来的,而其equals方法比较的也是字符串的
内容。
[java]
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
补充:软件开发 , Java ,