簡體   English   中英

同一對象的兩個列表具有不同的哈希碼

[英]Two lists of same objects have different hash codes

我有一個關於Java中List的hashCode實現的問題。

為了更好地理解,我將僅描述我的數據構造。 我從兩個不同的數據庫中讀取圖形信息,並將其存儲在抽象圖形表示形式中。 因此,我有兩個HashMap,每個數據庫一個。 該映射包含一個String作為鍵,一個GraphLayer對象作為值: HashMap<String, GraphLayer> GraphLayer對象具有兩個類型為PaperMetaDataConferenceSerieAndInstance自定義成員。 PaperMetaData由一些基本String類型的成員和HashMap<Author, Set<Affiliation>> 作者僅包含原始String成員以及關聯。 ConferenceSerieAndInstance還包含普通的String成員和HashMap<String, ConferenceInstance>類型的成員,其中ConferenceConference類僅包含String成員。 我希望到目前為止,一切都還清楚。

我從每個數據庫中讀取我的信息,並將其存儲在該數據庫的每個HashMap中。 之后,我將每個地圖轉換為列表。 到目前為止,一切都很好,但是列表中對象的順序是不同的(以及在轉換地圖之前,在地圖中)。 從HashMap到ArrayList的轉換看起來像這樣。

public List<GraphLayer> searchAuthor() { 
    ...
    return (List<GraphLayer>) new ArrayList<GraphLayer>(graph.values());
}

但是兩個列表都包含相同的對象。 如果我調用每個列表的方法hashCode()hashCode()得到不同的哈希碼。

我不明白為什么會得到不同的哈希碼。 根據Java文檔,將像這樣創建列表的哈希碼。

  int hashCode = 1;
  for (E e : list)
      hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

因此,列表中項目的順序不起作用。 如果我嘗試使用具有原始數據類型(如String)的列表進行操作,則它將起作用,但不適用於我的自定義數據類型。

有誰知道為什么它不起作用?

我還比較了列表一中PaperMetaDataConferenceSerieAndInstance成員的每個哈希碼,與列表二中的成員的哈希碼。 而且沒有區別。 但是,如果我比較完整列表的哈希碼,會有區別。 我不知道為什么。 我很無奈。

也許有人可以幫助我。 最好的問候和預先的感謝。

你的答案就在這里

到目前為止,一切都很好,但是列表中對象的順序是不同的(以及在轉換地圖之前,在地圖中)。

List#equals()

[...]如果兩個列表包含相同順序的相同元素,則定義為相等


由@SamiKuhmonen編輯

並且要詳細說明:哈希碼計算具有一個求和與乘法的循環。 如果哈希碼是1和2,並且在另一個列表2和1上,則結果是1 * 31 + 2和2 * 31 + 1,因此很明顯它們是不同的。


List<String> one = new ArrayList<String>();
List<String> two = new ArrayList<String>();
List<String> three = new ArrayList<String>();
String[] s = "A B C".split(" ");

for (String a : s){
    one.add(a);
    two.add(a);
}

for (int i = s.length-1 ; i >= 0 ; i--){
    three.add(s[i]);
}

System.out.println(one.hashCode());     // 94369
System.out.println(two.hashCode());     // 94369
System.out.println(three.hashCode());   // 96289
System.out.println(one.equals(two));    // true
System.out.println(two.equals(three));  // false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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