【问题标题】:Efficient alternative to Map<Integer, Integer> in Java, with regards to autoboxing?关于自动装箱,Java 中 Map<Integer, Integer> 的有效替代方案?
【发布时间】:2015-05-23 09:23:35
【问题描述】:

我正在使用LinkedHashMap&lt;Integer, Integer&gt; 来存储 2D 游戏中瓷砖上的图层值。较大的数字会覆盖较小的数字。

在我的绘图函数中,我遍历值集并绘制每个值。这意味着我正在拆箱值(width * height * numLayers) 次。我正计划移植到 Android,所以我希望尽可能高效,我认为这太过分了?

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

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

【问题讨论】:

  • 拆箱 非常有效——它所做的只是从一个对象中获取一个数字。它不会创建新对象或任何东西。您是否有任何证据表明这实际上给您带来了问题?
  • 我也在做大量的拳击,因为我在任何给定时间都加载了 2000 个块。不过,这更多的是内存问题而不是性能问题。

标签: java android linkedhashmap autoboxing unboxing


【解决方案1】:

地图的有效替代品?

SparseIntArraysHashMap&lt;Integer,Integer&gt; 更有效。根据文档

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

更多参考click here

适用于非 Android 语言

  • 编写您自己的基于哈希的地图类(不实现 collections.Map)。在单元格数组中使用“线性探针”相对简单——另一种技术是链表,它(再次)将与“直接数组”选项一样大。
  • GNU Trove has primitive maps 会做你想做的事。但是,如果您不想勉强占用内存的每个字节,我会赞同 Thomas 的建议,即只使用数组。

【讨论】:

  • 感谢您的回复,这听起来很完美。这个应用也是桌面的,我还能用吗?
  • android.util中没有这个类,所以它只适用于android
  • 由于我不能在桌面上使用这个类,所以它不再完美,但是我找到了源代码,我会用它作为参考来制作我自己的类。来源在这里:android.googlesource.com/platform/frameworks/base/+/…
猜你喜欢
  • 2014-05-04
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多