我还能用什么来代替HashMap?

时间:2010-07-15 11:43:47

标签: java hashmap

在我的项目中,我从两台服务器获取一个表单的条目并将它们保存在一个hashmap中。

键是serverName,值是2d ArrayList(ArrayList<ArrayList<Object>>

在ArrayList中,我保留属于该服务器上的表单的字段的值。 我在两个服务器中比较这些值并将它们打印到excel文件。

我的问题是,当我获得一个包含12000个条目和100个字段的表单时,此映射使用大约400M的内存。我不希望我的程序使用这么多内存。你能告诉我什么吗?

4 个答案:

答案 0 :(得分:5)

我怀疑它是导致问题的hashmap,但是ArrayList,因为它默认为10个条目分配空间。如果您只为每个索引存储一个或两个值,那么这将是浪费。

您可以尝试将初始大小设置为1或2以查看是否有帮助。潜在的缺点是,如果尺寸太小,将导致频繁的重新分配。但是你会发现自己是否会导致任何明显的放缓。

答案 1 :(得分:2)

HashMap在这里完全不是问题。 ArrayList<ArrayList<Object>>中实际包含哪些对象?

你真的应该使用VisualVM并做一些heap profiling来查看实际占用你的记忆。这比这里的猜测要好得多,你可能会对结果感到惊讶。

答案 2 :(得分:1)

我认为大量的内存浪费是因为使用了大量的ArrayLists。它们设计用于动态使用(添加和删除),因此它们通常具有许多未使用的位置。如果矩阵是静态的,请考虑使用2d数组而不是列表列表。否则,尝试将ArrayList的容量设置为某个估计值,而不是默认值。

答案 3 :(得分:0)

问题显然不是Hashmap本身,因为它只有两个条目(密钥是你的两个服务器名称)。您只需要处理大量数据(2 x 12000 x 100值,如果我说得对,加上结果,这是一个'excel文件')。它只需要一些记忆。大对象是两个2D数组列表。地图只引用了这些数据结构。

通常我不在乎,只是将最大堆大小增加到512M甚至1G。