2011-10-13 81 views
2

是否有一種方法可以通過其trimToSize()方法使用ArrayList來壓縮HashMap?Java:緊湊的HashMap(ArrayList#trimToSize的模擬)

我能想到的一種方法是遍歷當前地圖中的所有條目並填充一個新的,然後用新的替換原來的。

有沒有更好的方法來實現這個目標?

+0

如果您擔心HashMap佔用額外的空間,請在創建時傳遞更高的加載因子。 – Jagat

回答

5

那麼你不需要去通過手工迭代- 你可以用:

map = new HashMap<String, String>(map); // Adjust type arguments as necessary 

我相信一定會做所有的迭代你。這是可能clone()將做同樣的事情,但我不知道肯定。無論哪種方式,我不相信你錯過了任何東西 - 我不認爲有任何方式在當前的API中執行「修剪」操作。與ArrayList不同,這樣的操作無論如何都會相當複雜(因爲擴展是) - 這不僅僅是創建新陣列和執行單個陣列副本的情況。條目需要重新分配。獲得HashMap在內部自己做這件事的好處可能就是哈希代碼不需要重新計算。

+0

手動迭代的想法很有趣!你需要特殊的手套來抓住hashmap的條目嗎? :-) –

+0

@JBNizet:是的 - 參見'HashMap.Entry',它有一個最後的'hash'字段。我誤解了一些東西嗎? –

+0

不,你沒有。我錯過了Entry中的散列字段。我的錯。 –

-1

如果您使用trove library而不是它支持哈希映射和散列集裁剪(請參閱THashMap對象,精簡方法),並且最重要的是,當映射變得太稀疏時自動修剪刪除對象。這應該比使用標準的Java HashMap實現構建新映射更快(假設),它不必根據哈希碼對對象進行重新排序,但可以使用它已知的順序。