2013-02-06 78 views
0

我想知道如果我重寫toString方法,從對象返回的實例之一,那麼它是否更有可能導致衝突?例如,重寫toString方法,並避免碰撞

class Student{ 
    private String name; 
    private double gpa; 
    public Student(String name, double gpa){ 
     this.name = name; 
     this.gpa = gpa; 
    } 
    public String toString(){ 
     return name; 
    } 
} 

所以,問題是,我想說明的名字,當打印Student對象,但是當兩個不同的學生具有相同的名稱(不同的GPA)將導致我一個問題,如果我存儲他們所有在HashMap中。 有什麼替代方法可以避免碰撞,而無需修改原始學生課程,或者對其進行最小限度的修改?

+2

你混淆了'hashCode'和'toString'方法嗎? 'toString'幾乎僅用於信息/顯示目的。 – Perception

+0

只需使用所有方法'toString','equals'和'hashCode'中的屬性。 –

+0

是的,如果您正在使用地圖系列,則沒有使用toString方法。對於地圖系列,您需要學習hashCode和equals方法。 toString用於顯示目的。 –

回答

1

鑑於你的標籤,你似乎談論HashMap中的哈希碰撞?

toString()與HashMap的行爲沒有任何關係。對於在HashMap中作爲鍵的唯一兩種重要方法是equals(Object)hashcode()

此外,HashMap是碰撞安全的,所以你不需要關心散列衝突。

0

如果您想在基於哈希表的集合(如HashMap,HashSet等)中使用您的類,則應正確覆蓋和實現hashCodeequalstoString與HashMap無關。

0

也許這將幫助:

class Student{ 
    private static AtomicInteger nextUniqueID = new AtomicInteger (0); 

    private final int uniqueID = nextUniqueID.getAndIncrement(); 
    private String name; 
    private double gpa; 
    public Student(String name, double gpa){ 
     this.name = name; 
     this.gpa = gpa; 
    } 
    public String toString(){ 
     return name + " [" + uniqueID + "]"; 
    } 
} 
0

hashCode Java中的默認實現是其所有變量的值的混合在一起,湊一點。所以,toString是什麼並不重要。

0

HashMap內部存儲在一個表中。該鍵用於標識表索引,因此密鑰類重寫hashCode()是很重要的,因爲hashCode值將用於確定表索引。如果兩個不同的鍵導致相同的散列碼或不同的散列碼映射到相同的表索引,則會發生衝突,這意味着兩個不同的條目指向相同的存儲桶位置。如果發生衝突,則先前的條目將鏈接到新的(鍵值),從而鏈接列表開始。

如果您希望您的學生類被用作鍵,那麼它重要的是它會覆蓋hashCode()。嘗試確保hashCode()返回唯一值以最小化衝突。如果兩個學生有相同的名字,可能你也應該依靠一些ID。在這種情況下,需要使用name和Id來計算hashCode。還要確保你重寫equals(),這在碰撞情況下非常重要,key.equals()將有助於識別鏈表中的關鍵字。