【发布时间】:2015-07-15 09:54:54
【问题描述】:
我有很多(不可变的)Integer 值列表。
其中一些包含完全相同的值。所以为了节省内存,我想找到那些。
出于这个原因,我使用HashMap<String, List<Integer>>
一种可行的方法是将值简单地连接到一个大的String 并将其用作HashMap 中的键。
这种方法工作可靠,但速度很慢,而且消耗大量内存。
我的 Integer 值介于 1 到 100,000,000 之间。这些列表包含 1 到 1000 个 Integer 值。
最多可以有 100,000,000 个列表。
我需要确保没有冲突。
【问题讨论】:
-
假设您有两个列表,一个是
1 -> 2 -> 3,另一个是2 -> 1 -> 3。两者都包含相同的数字,但如果我按顺序将每个数字连接到String,我不会得到相同的结果。你是如何连接各种列表的,有什么顺序吗? -
在我看来,检查相等性比复制几个 List 要花费更多的精力。
-
为什么不使用
hashCode作为映射键? -
@rzysia:因为 hashCodes 不是碰撞安全的。
-
由于pigeonhole principle,不可能为任意整数列表计算唯一短键(例如,
int或long) .如果这是可能的,您将拥有一个出色的压缩算法 - 您可以将任意数量的数据压缩成一个小的、固定长度的代码……这显然是不可能的。