Java:压缩HashMap(类似于ArrayList#trimToSize)

Java:压缩HashMap(类似于ArrayList#trimToSize),java,memory,collections,hashmap,Java,Memory,Collections,Hashmap,有没有一种方法可以通过ArrayList的trimToSize()方法压缩HashMap 我能想到的一种方法是迭代当前映射中的所有条目并填充一个新条目,然后用新条目替换原始条目 有没有更好的方法来实现这一点?您不需要手动进行迭代,只需使用: map = new HashMap<String, String>(map); // Adjust type arguments as necessary map=newhashmap(map);//根据需要调整类型参数 我相信这将为您完成所

有没有一种方法可以通过ArrayList的trimToSize()方法压缩HashMap

我能想到的一种方法是迭代当前映射中的所有条目并填充一个新条目,然后用新条目替换原始条目


有没有更好的方法来实现这一点?

您不需要手动进行迭代,只需使用:

map = new HashMap<String, String>(map); // Adjust type arguments as necessary
map=newhashmap(map);//根据需要调整类型参数
我相信这将为您完成所有迭代。有可能
clone()
会做同样的事情,但我不确定


无论哪种方式,我都不认为您遗漏了什么——我认为在当前的API中没有任何方式可以执行“修剪”操作。与
ArrayList
不同,这样的操作无论如何都会相当复杂(就像扩展一样)-它不仅仅是创建一个新数组并执行单个数组拷贝的情况。这些条目需要重新分发。让
HashMap
本身在内部执行此操作的好处可能只是哈希代码不需要重新计算。

如果您使用,则它支持哈希映射和哈希集修剪(请参阅THashMap对象,压缩方法),而且最重要的是,当贴图变得过于稀疏时,在删除对象时自动修剪。这应该比使用标准java HashMap实现构建新映射更快,因为(可能)它不必根据对象的hashcode对对象进行重新排序,只需使用它已经知道的顺序即可。

手动迭代的想法很有趣!您是否需要特殊手套来夹持hashmap的条目?:-)@JBNizet:是的,它确实存在-请参阅
HashMap.Entry
,它有一个最终的
hash
字段。我误解了什么吗?不,你没有。我遗漏了条目中的散列字段。我错了。这并不能完全回答问题。您正在创建一个新地图。原始映射没有按照与ArrayList.trimToSize()相同的意义进行压缩。@PoweredByRice:问题是“有没有压缩HashMap的方法”,我的回答是“我认为在当前API中没有任何方法执行“trim”操作”。如果您担心HashMap占用额外空间,创建时传递更高的负载系数。