2017-03-27 90 views
4

我们使用HashMap<Integer, SomeType>()以及超过一百万个条目。我认为这很大。改善内存使用情况:IntegerHashMap

但整数是他们自己的哈希码。难道我们不能通过使用特殊的Map.EntryIntegerHashMap<Integer, SomeType>()来节省内存,直接使用int而不是指向Integer对象的指针吗?在我们的例子中,这将节省1000000x的Integer对象所需的内存。

我的思路有什么毛病?太特别是一般的兴趣? (至少有一个EnumHashMap

add1。第一个通用参数IntegerHashMap用于使其与其他Map实现非常相似。当然可以放弃它。

add2。其他地图和集合应该也是可以的。例如ToIntegerHashMap<KeyType, Integer>IntegerHashSet<Integer>

回答

2

你在找什么是“原始集合”库。内存使用情况和性能通常更好。最古老/最受欢迎的图书馆之一被称为“Trove”。不过,现在有点过时了。使用中的主要活性图书馆现在是:响应

See Benchmarks Here

+0

对我来说最适合的是作为JDK/Apache公共部分的原始集合的(任何)实现/番石榴。不幸的是,使用额外的库对我来说并不容易。而速度并不是我所关心的,而是记忆。尽管如此,你的答案可能和我所能得到的一样接近。 –

1

一些注意事项:

  1. “整数是自己的散列码”我会非常小心这种说法。根据你有的整数,密钥的分配可能是从最优到可怕的任何事情。理想情况下,我会设计地图,以便您可以将自定义IntFunction作为哈希策略传递。如果需要,您仍然可以将其默认为(i) -> i,但您可能想要引入模数因子,否则您的内部数组将会很大。你甚至可以使用IntBinaryOperator,其中一个参数是int,另一个是桶的数量。

  2. 我会放弃第一个通用参数。你可能不想实现Map<Integer, SomeType>,因为那样你将不得不在所有方法中使用box/unbox,并且你将失去所有的优化(空间除外)。试图使一个原始集合与一个对象集合兼容将会使整个操作变得毫无意义。

+1

好点 “整数是自己的散列码” 的声明。为了简单起见,我将为整数构建一个适当的散列方法。但是,如果你使用一个“Map.Key”对象,那也可以完成。 –

+0

@UlrichScholz我认为整个观点是尽可能避免物体。但这取决于你的用例是什么。 –

+0

当然,我想避免不必要的对象。尽可能避免它们是另一回事。 我不熟悉当前的'HashMap'实现的细节。但是'IntegerHashMap'应该可以紧随其后,除了使用'int'键以及一个正确的散列函数。 (甚至可以用'Integer'实现)。 –