哈希碼(也叫散列碼)是一個(gè)整數(shù)值。計(jì)算整數(shù)的算法稱為散列函數(shù)。Java使用散列碼從基于散列的集合中有效地檢索數(shù)據(jù)。Object
類有一個(gè)返回int
的hashCode()
方法,它是對(duì)象的哈希碼。
該方法的默認(rèn)實(shí)現(xiàn)通過(guò)將對(duì)象的內(nèi)存地址轉(zhuǎn)換為整數(shù)來(lái)計(jì)算對(duì)象的哈希碼。下面是我們?cè)陬愔兄貙?xiě)hashCode()
方法時(shí)必須遵循的規(guī)則。
假設(shè)有兩個(gè)對(duì)象引用,x
和y
。
如果x.equals(y)
返回true
,x.hashCode()
必須返回一個(gè)整數(shù),它等于y.hashCode()
。
如果兩個(gè)對(duì)象使用equals()
方法相等,則它們必須具有相同的哈希碼。
如果x.hashCode()
等于y.hashCode()
,則x.equals(y)
不必返回true
。
如果對(duì)同一個(gè)對(duì)象多次調(diào)用hashCode()
方法,則該方法必須返回相同的整數(shù)值。
如果一個(gè)類覆蓋這兩個(gè)方法中的任何一個(gè),它必須基于散列集合覆蓋該類的對(duì)象以保證能正確工作。Java 7添加了一個(gè)實(shí)用程序類java.lang.Objects
。 它包含一個(gè)hash()
方法,用于計(jì)算任意數(shù)量值的哈希碼。從java 7,使用Objects.hash()
方法來(lái)計(jì)算對(duì)象的哈希碼。
以下代碼顯示如何計(jì)算哈希值。
class Book {
private String title;
private String author;
public int hashCode() {
int hash = 37;
int code = 0;
// Use title
code = (title == null ? 0 : title.hashCode());
hash = hash * 59 + code;
// Use author
code = (author == null ? 0 : author.hashCode());
hash = hash * 59 + code;
return hash;
}
}