我試圖瞭解什麼在一個哈希碼方法返回..對於一個字符串我知道,我要返回(例如)name.hashcode()。但是,我爲什麼返回一個int變量?當他們返回可變數字x 1 000時,我看到了不同的例子,但是從來沒有理解爲什麼。哈希碼返回整數值
任何人都可以請爲我解釋如何返回一個整數值。
我試圖瞭解什麼在一個哈希碼方法返回..對於一個字符串我知道,我要返回(例如)name.hashcode()。但是,我爲什麼返回一個int變量?當他們返回可變數字x 1 000時,我看到了不同的例子,但是從來沒有理解爲什麼。哈希碼返回整數值
任何人都可以請爲我解釋如何返回一個整數值。
如果你有一個類Foobar
:
public class Foobar {
private final int myInt;
... constructor ...
public int hashCode() {
return Integer.hashCode(myInt);
}
}
由於Java 8,Integer.hashCode
存在的方法。否則,您可以使用Integer.valueOf(myInt).hashCode()
。
注:in the question,你會讀到的hashCode和equals不應該基於可變場,這就是爲什麼我在myInt
聲明把final
。實際上,它取決於用例(例如,Set
基於JPA中的OneToMany
中生成的ID)以及哪裏有數據。
現在對於「好」hashCode
,由於它用於基於哈希的集合(地圖,集合),因此您需要有一個良好的重新分區:想象您返回myInt % 1000
,這意味着介於0和999之間的值;然後這個HashSet
不會高效:
Set<Integer> set = new HashSet<Integer>(20); // initial capacity of 20
set.add(0); // 0 [[0]]
set.add(1000); // 0 [[0, 1000]]
set.add(2000); // 0 [[0, 1000, 2000]]
set.add(3000); // 0 [[0, 1000, 2000, 3000]]
set.add(20); // 20 -> 20 % 20 => 0 [[0, 1000, 2000, 3000, 20]]
set.add(21); // 1 -> 1 % 20 => 1 [[0, 1000, 2000, 3000, 20], [1]]
在註釋和按以下順序:
hashCode
在內部HashSet
陣列返回由myInt % 1000
index
。 HashSet
前四個值(0到3000)的
myInt
而不是調用Integer.hashCode
)Long.hashCode
。P * o.hashCode()
的總和,其中P是質數;見Arrays.hashCode
但我不記得爲什麼你應該使用素數的確切答案。
我不明白爲什麼會乘以1000.通常只是返回值應該沒問題。 – Keppil 2014-09-19 11:58:41
[在Java中重寫equals和hashCode時應考慮哪些問題?](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and- hashcode-in-java) – 2014-09-19 11:59:39
這個問題給出了所有你需要知道的理解hashCode及其目的以及如何正確實現它:http://stackoverflow.com/questions/27581/what-issues-should-be-considered-覆蓋時等於和 - hashcode-in-java – 2014-09-19 12:00:18