关于自动装箱,Java 中 Map<Integer, Integer> 的有效替代方案?

Aud*_*row 5 java autoboxing android unboxing linkedhashmap

我正在使用 aLinkedHashMap<Integer, Integer>来存储 2D 游戏中图块上的图层值。较高的数字覆盖较低的数字。

在我的绘制函数中,我迭代设置的值并绘制每个值。这意味着我要(width * height * numLayers)多次拆箱价值观。我计划移植到 Android,因此我希望尽可能高效,但我认为这太多了?

我使用地图的原因是因为层数(键)很重要:4 以上的键是在玩家上方绘制的,等等。所以我经常需要跳过一堆键。

我可能可以只使用 an,int[10]因为我不需要那么多层,但是与我当前的 HashMap 相比,所有未使用的层都会占用 32 位,而我当前的 HashMap 可以有键 0、9,只占用 64 位位。

Kar*_*eek 3

地图的有效替代品?

SparseIntArrays比 更有效HashMap<Integer,Integer>。根据文件

SparseIntArrays 将整数映射到整数。与普通整数数组不同,索引中可以存在间隙。与使用 HashMap 将整数映射到整数相比,它的内存效率更高,因为它避免了自动装箱键和值,而且它的数据结构不依赖于每个映射的额外条目对象。对于容纳数百个物品的容器,性能差异并不显着,小于 50%。

如需更多参考,请点击此处

对于非 Android 语言

  • 编写您自己的基于哈希的映射类(不实现 collections.Map)。在单元阵列中使用“线性探针”相对简单——另一种技术是链表,它(再次)将与“直接阵列”选项一样大。
  • GNU Trove 有原始地图,可以满足您的需求。但是,如果您不想耗尽每个字节的内存,我会赞同托马斯的建议,只使用数组。