2015-10-26 46 views
0

我有幾個與存儲HashMap相關的場景,我不知道該如何實現。Java HashMap在內部存儲在不同桶中

案例1:由於存在對象被保存在其中的桶,並且在保存對象時將考慮哈希碼。現在說,有5個桶,我想自己控制哪個桶來保存它。有沒有辦法實現它?說,通過內部機制,它將被保存到桶4中,但我想將該特定對象保存到桶1中。

案例2:同樣,如果我看到5個桶中有1桶正在比其他更多的負載,我想通過將它移動到不同的桶來做一個負載平衡類型的工作。如何才能完成?

+3

這些實現設計,使你不應該擔心這些細節。 – sdgfsdh

+0

的確如此。想知道,有什麼辦法來控制自己。有一些方法,我沒有找到它 – Deca

+0

@sdgfsdh你應該作出回答 – CPerkins

回答

1

實現的設計使您不必擔心這些細節。

如果你想更仔細地控制這些,那麼你可以創建自己的類實現Map

2

基本上沒有辦法在哈希表中實現負載平衡。這種結構的典型特徵是直接訪問必須保存請求密鑰的桶。任何平衡計劃都會涉及重新洗淨水桶之間的物體並摧毀這個屬性。這就是爲什麼高質量的hashcode對散列表正確運行至關重要的原因。

此外請注意,你甚至無法通過操縱你的對象的hashCode()方法控制桶的選擇,因爲任何兩個相等對象的散列碼必須匹配,並且因爲任何有自尊的散列表實施方案將另外洗牌值的位從hashCode()檢索,以確保更好的分散。

1

使用HashMap和所有名稱以Hash開頭的集合,更重要的部分是您嘗試存儲的域對象生成的hasCode。這就是爲什麼每個對象都有一個hashCode實現(implicit with object.hashCode()或明確地)。

首先HashMap試圖完成你在情況2(有點)中陳述的內容。如果你的hashCode實現是好的,意思是可以爲各種對象生成均勻分散的hashCode值,而HashMap的桶的加載或多或少是均勻分佈的,並且你不需要任何東西(除了編寫一個好的hashCode函數)。 。你也可以以某種方式通過相應地實現你的hascode,通過爲你希望它們在同一個桶中的對象生成相同的哈希碼來平衡平衡。

如果你想完全控制hashMap的內部,你應該通過實現Map接口來實現你自己的HashMap。

+0

是的,最好確保你的對象散列「正確」,而不是試圖使用HashMap實現 – secolive

1

將存儲桶創建和佈局的基本機制抽象出來。 對於案例1,您可以簡單地使用對象作爲存儲桶佈置的關鍵字。對於情況2,您無法直接看到對象的實際位置。

雖然,你可以做的是使用Multimap,你可以把它們看作是桶。它基本上是從鍵到集合的映射。在這裏你可以檢查任何給定的鍵(桶),看看你有多少物品放在那裏。在這裏你可以滿足這兩種情況的要求。這可能與您在不實際篡改內部分揀機制的情況下獲得的結果相近。

從鏈接,這裏是一個片段:

public class MutliMapTest { 
    public static void main(String... args) { 
    Multimap<String, String> myMultimap = ArrayListMultimap.create(); 

    // Adding some key/value 
    myMultimap.put("Fruits", "Bannana"); 
    myMultimap.put("Fruits", "Apple"); 
    myMultimap.put("Fruits", "Pear"); 
    myMultimap.put("Vegetables", "Carrot"); 

    // Getting the size 
    int size = myMultimap.size(); 
    System.out.println(size); // 4 

    // Getting values 
    Collection<string> fruits = myMultimap.get("Fruits"); 
    System.out.println(fruits); // [Bannana, Apple, Pear] 

    Collection<string> vegetables = myMultimap.get("Vegetables"); 
    System.out.println(vegetables); // [Carrot] 

    // Iterating over entire Mutlimap 
    for(String value : myMultimap.values()) { 
    System.out.println(value); 
    } 

    // Removing a single value 
    myMultimap.remove("Fruits","Pear"); 
    System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear] 

    // Remove all values for a key 
    myMultimap.removeAll("Fruits"); 
    System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!) 
}