2013-08-01 28 views
4

我知道有在java中相同的哈希碼objects.It不作在all.So任何問題多的對象,什麼是java的覆蓋哈希碼的目的...在java對象中重寫hashcode的目的是什麼?

在什麼情況下最好是做到覆蓋在Java中的哈希碼?

+1

@RohitJain:我看到了,但它並沒有真正談論*目的*。 –

+0

@JonSkeet。是的,這不是真的圍繞着目的。但在某種程度上,某種答案在一個小的聲明中提到。它仍然對OP有用。 :) –

回答

8

在哪種情況下,建議在java中重寫散列碼?

當你覆蓋equals,基本上。這意味着基於散列的集合(例如HashMap,HashSet)可以非常快速地找到一組候選候選對象,這些對象將等於您正在查找的對象(或嘗試添加的對象或其他對象)。如果你有一個很大的集合,你可以用散列碼將它分成桶。當您嘗試查找某些內容時,會發現已傳遞對象的哈希代碼,並在相關存儲區中查找具有相同哈希代碼的對象。然後爲每個對象使用與確切相同的哈希碼,您可以撥打equals查看兩個對象是否爲真的是一樣。

查看Wikipedia article on hash tables瞭解更多信息。

編輯:對哈希碼選擇一個快速注...

它總是有效只覆蓋hashCode也不管返回一些常數(同爲每次調用)的對象的內容。然而,在這一點上,你將失去散列碼的所有好處 - 基本上,基於散列的容器會認爲你的類型的任何實例可能與其他類型的實例相同,因此搜索一個將包含O(N)調用到equals

在天平的另一端,如果不正確地實現hashCode並返回調用等於對象不同值(或同一對象上兩個調用兩次),你將無法找到當你搜索它的對象時 - 不同的哈希代碼將排除平等,所以equals將永遠不會被調用。

然後有可變性的方面 - 它通常是一個壞主意的equalshashCode使用對象的可變方面:如果發生變異的散列方式轉變的對象,你已經插入它變成一個基於散列的後集合,您將無法再次找到它,因爲插入時的散列將不再正確。

+0

我建議指出每個方向不一致的不同後果。擁有兩個相同但具有不同哈希碼的對象可能會導致哈希數據結構出現錯誤答案。讓所有元素使用相同的散列碼將永遠不會導致錯誤的答案,但會導致較差的性能。 –

+0

@PatriciaShanahan:好點。當我有時間時會添加一個編輯。 (可能不會有一段時間。) –

+0

@jonSkeet我很抱歉...我不清楚...你能爲我解釋一點點嗎? – Saravanan

相關問題