2012-10-16 92 views
6

我有一個Java類的程序,我想使用hashSets比較文本文檔的目錄。本質上,我的計劃是爲每個紙張創建一個字符串哈希集合,然後將兩個論文hashSets一起添加到一個哈希集合中,並找出相同的6個字符序列的數量。Java中的HashSet碰撞

我的問題是,我必須手動檢查並處理衝突,或者Java是否爲我做這件事?

+1

你可以找到你ans [here](http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions) –

回答

3

Java哈希映射/集自動哈德爾哈希碰撞,這就是爲什麼覆蓋equalshashCode方法都很重要的原因。由於它們都被集合用來區分重複或唯一的條目。

重要的是要注意,由於多個對象被相同的哈希引用,所以這些哈希衝突具有性能影響。

public class MyObject { 
private String name; 

//getter and setters 


public int hashCode() { 
    int hashCode = //Do some object specifc stuff to gen hashCode 
    return int; 
} 

public boolean equals(Object obj) { 
    if(this==obj) return true; 
    if(obj instanceOf MyObject) { 
     if(this.name.equals((MyObject)obj.getName())) { 
      return true; 
     } 
    return false; 
} 
} 
} 

注:標準Java對象如String已經實施的hashCode和equals,所以你只需要做到這一點對自己的一種數據對象。

+0

好的,很酷。我讀了相當多的帖子,說HashMaps有內置的碰撞處理,但我找不到任何具體說明HashSets內置碰撞處理的東西。 – marcinx27

+0

請注意我的編輯:重寫hashCode和equals方法非常重要,因爲這兩個方法都被Sets用來識別重複項。 – dngfng

+0

你是什麼意思? – marcinx27

0

我想你沒有要求散列衝突,對吧?問題是當HashSet a和HashSet b被添加到一個集合中時會發生什麼,例如由a.addAll(b)。

答案是一個將包含所有元素和沒有重複。在字符串的情況下,這意味着您可以在add-b.size()之後添加a.size()之前,使用a.size()從集合中計算相等字符串的數量。

即使某些字符串具有相同的哈希碼但不相等也不重要。

+0

只有當您將String對象添加到Set或其他已經實現了hashCode和equals的對象時,纔會這樣。如果你有自己的對象,你肯定會實現它們。 – dngfng

+0

種。我在說的是,如果我做a.addAll(b),是否確定我不會有任何重複,並且確定a和b中的每個唯一字符串都會在那裏? – marcinx27

+0

@dngfng所以如果我使用字符串,我不需要檢查碰撞。我可以把所有的字符串放到他們的hashSets中,並確定獨特的東西在那裏,而且沒有重複? – marcinx27