[英]Strange behavior while using HashSet
我正在使用HashSet存儲我編寫的新類型的對象。 類型定義具有以下種類:
class Node{
Node arr[] = new Node[5];
boolean flag = false;
}
我重寫了hashCode,如下所示:
int hash = Arrays.deepHashCode(arr);
if(flag==true)
return hash;
else
return -hash;
等於:
public boolean equals(Object other){
Node t = (Node) other;
return Arrays.deepEquals(arr, t.arr)&&(flag==t.flag);
}
我將單詞添加到節點(節點是trie節點)中,並且按字典順序這樣做。 然后,我將節點存儲到哈希集中。 奇怪的是,雖然散列集可以很好地處理以一個字母開頭的單詞,但是當我使用以下一個字母開頭的單詞時,我的代碼就會卡住。 例如,對於以“ a”開頭的單詞,一切都可以正常工作,但是對於以“ b”開頭的單詞,一切都會卡住。 與“ c”和“ d”等相同。
我將其范圍縮小到一行代碼:將節點添加到哈希集的行。
由於我沒有編寫哈希集,所以我不知道這里發生了什么。 我確定這就是代碼卡住的地方(它不會崩潰。它似乎無限循環,但我不確定)。 有人知道發生了什么嗎?
- 編輯 -
后來有很多頭刮花和許多打印聲明,我確定即使要繪制的圖形也不是DAG,因此DeepHashCode和deepEquals函數被拋棄了。
當您不重寫hashCode()方法時會發生什么? 您是否在節點數組中引用了可能解釋無限循環的同一節點,但是隨后您應該看到一些堆棧溢出異常。 嘗試不使用引用相等來覆蓋hashCode()方法的含義,它是否還在發生? 如果不是,那么您當前的hashCode()中有問題。
HashSet將只對您的節點做兩件事:調用hashCode()並使用equals()比較它們。 考慮鍵入control-break(在Windows中)或發送INT3信號(在Linux中)以獲取線程轉儲。
首先要看的是您的hashcode()和equals()方法-您是否遇到無限循環的情況?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.