2011-10-13 79 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实现构建新映射更快(假设),它不必根据哈希码对对象进行重新排序,但可以使用它已知的顺序。