簡體   English   中英

使用HashSet時的奇怪行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM