Java中的内存高效稀疏数组

时间:2012-09-27 16:39:02

标签: java memory sparse-array

(有一些关于时间效率稀疏数组的问题,但我正在寻找内存效率。)

我需要相当于List<T>Map<Integer,T>

  1. 只需设置比以前遇到的任何键更大的密钥,即可按需增长。 (可以假设密钥是非负的。)
  2. 在大多数索引不是ArrayList<T>的情况下,即当实际数据不是很稀疏时,与null一样具有内存效率。
  3. 当索引稀疏时,消耗的空间与非null索引的数量成比例。
  4. 使用的内存少于HashMap<Integer,T>(因为这会自动锁定密钥,可能不会利用标量密钥类型)。
  5. 可以在分摊的日志(N)时间内获取或设置一个元素,其中N是条目数:不必是线性时间,二元搜索是可以接受的。
  6. 在非病毒开源纯Java库中实现(最好在Maven Central中)。
  7. 有谁知道这样的实用类?

    我原本希望Commons Collections有一个,但似乎没有。

    我遇到的org.apache.commons.math.util.OpenIntToFieldHashMap看起来几乎是正确的,除了价值类型是FieldElement似乎是无偿的;我只想要T extends Object。它看起来很容易编辑它的源代码更通用,但我宁愿使用二进制依赖,如果有一个。

5 个答案:

答案 0 :(得分:6)

我会尝试使用trove个集合,TIntObjectMap可以用于您的意图。

答案 1 :(得分:4)

我会看一下Android的SparseArray实现的灵感。您可以通过在http://source.android.com/source/downloading.html

下载AOSP的源代码来查看源代码

答案 2 :(得分:1)

我已将我的测试用例保存为jglick/inthashmap。结果:

HashMap size: 1017504
TIntObjectMap size: 853216
IntHashMap size: 846984
OpenIntObjectHashMap size: 760472

答案 3 :(得分:1)

我建议你使用Colt库中的OpenIntObjectHashMap。 Link

答案 4 :(得分:0)

这个问题很晚,但是libgdx中有IntMap,它使用cuckoo hashing。如果有什么话,可以与其他人进行比较。