3

我有需要映射到整数(或原始整数)的对象。

所以例如

Object[] objects = new Object[X];
objects[2]=o1;
objects[34]=o2;
objects[126]=o3;
...

所以我有一个从 0 到 X 的键范围,但只需要几个(比如说 20 个)映射对。(映射只做一次,不会改变)

使用 Map (以及哪种实现最适合)而不是大多数未使用的“大”数组会是(性能和内存使用虎钳)更好的主意。

在开发过程中,所需的范围实际上可能会扩大 - 所以如果它只对非常大的 X 很重要,那对我来说仍然很有趣。(目前 X 是 256 - 非常小)

总结一下:我想有效地将​​数字映射到 Java 中的对象。

4

7 回答 7

3

使用地图。

性能差异应该可以忽略不计。假设当您说“性能”时,您指的是查找(正如您所说的映射只完成一次并且不会改变),使用直接数组查找性能会更好。使用数组,您的预期查找将是O(1). 如果您有一张地图并且使用整数作为键,那么您的查找应该是O(1)预期的情况和O(n)最坏的情况。鉴于您提到的配对数量很少(20),性能差异不会很大。

但是,Map 的内存使用会明显更好,因为 Array 将是稀疏填充的。

更新

感谢所有提供意见和反馈并帮助我学习的人。@JohnnyO 说数组查找是正确的O(1),我根据他的反馈更正了我的帖子。我一直在想 ArrayList。

于 2013-01-23T01:22:57.793 回答
2

您是否使用最快的可能性(数组)或HashMap取决于您的应用程序。您每秒有数百万次计算(数组访问)吗?是的,然后取数组,并花费 1k 的内存。
或者拿地图。
但是如果 x 很大,还有第三种解决方案:这个解决方案几乎和 map 一样快(也许更快),但使用的空间更少:
使用 int 的排序数组作为对象数组的索引:

int[] idx ={2, 34, 126}
Object[] objs = {o1, o2, o3};

Idx 必须按升序排序。现在获取键 34 的对象:

int pos= Arrays.binsearch(34, idx); // params might be wrong, please correct
Object o = objs[pos];

但是这我只会将它用于具有最小存储空间要求的大量对象,其中对象在运行时不会改变。

于 2013-01-23T02:08:36.213 回答
1

我会使用 aMap因为这确实是它的用途。除此之外,使用 aMap可能会使您的代码在未来更容易更新和管理。至于您应该使用哪种实现,在我看来 aHashMap就足够了,尽管如果您想按顺序保留整数键,您可能还需要考虑 a TreeMap

于 2013-01-23T01:20:56.977 回答
1

阵列显然会给你最快的访问,但如果你有这样的差距,你会浪费相当多的空间。

如果您正在寻找一种灵活的数据结构,它将键(例如整数)与值相关联,其中范围内可能存在间隙,并且您以后可能会增加它,我想不出比这更合适的了一张地图。如果您确切知道您计划插入多少元素,您可能需要研究 HashMap 等实现的构造函数参数,它可以让您调整底层存储的大小,以减少空间和减少冲突。

Map 的另一个结果是,如果您需要使用它执行其他面向集合的任务,您将获得更丰富的 API。

于 2013-01-23T01:22:29.520 回答
1

正如您所说,地图是做到这一点的好方法。我通常使用哈希映射,因为它非常快。虽然不如数组快。如果每个值只有一个键,您甚至可能想要使用 HashSet,因为它可以确保每个键只使用一个值。

android API 有一个叫做 SparseIntArray 的东西,它应该有更好的性能,但我在标准的 java API 中没有看到它。

如果性能真的很重要,您可能会发现 trove 库具有适当的稀疏数组或映射。当您使用原语时,它只会更快(在您的情况下是这样)

于 2013-01-23T01:27:38.370 回答
1

你真正想要的是一个 SparseArray。它是法线贴图和数组之间的折衷。

如果您正在为 Android 开发,那么您可以使用一个(请参见下面的链接)。否则,您可能会找到可用的实现。

http://developer.android.com/reference/android/util/SparseArray.html

于 2013-01-23T01:29:22.907 回答
0

我会推荐一张地图,原因有一个:可变长度。跟踪您需要映射的对象可能会变得相当乏味。使用HashMap或类似的实现将保证您的映射对象始终具有足够的容量。除此之外,使用 Map 更有意义,因为这是设计的目的,使您的代码对其他人更具可读性。我想原始数组会占用更少的内存,但实际上地图的开销对于您所说的比例来说并不是很重要。

于 2013-01-23T01:24:21.747 回答