我有需要映射到整数(或原始整数)的对象。
所以例如
Object[] objects = new Object[X];
objects[2]=o1;
objects[34]=o2;
objects[126]=o3;
...
所以我的键有一个从0到X的范围,但只需要几个(比如20个)映射对。 (映射只进行一次,不会改变)
使用Map(以及哪种实现方式最适合)是否更好(使用性能和内存使用vise)而不是大部分未使用的“大型”数组。
所需的范围实际上可能会在开发过程中稍后扩大 - 所以如果它对于非常大的X来说非常重要,那对我来说仍然很有意义。 (目前X为256 - 非常小)
总结一下:我想有效地将数字映射到Java中的对象。
答案 0 :(得分:3)
使用地图。
性能差异应该可以忽略不计。假设当你说“性能”时,你指的是查找(如你所说,映射只进行一次并且不会改变),使用直接数组查找会更好。使用数组,您的预期查找将为O(1)
。如果您有一张地图并且使用整数作为键,那么您的查找应该是O(1)
预期大小写和O(n)
最坏情况。鉴于您提到的对数量很少(20),性能差异不会很大。
然而,Map的内存使用量会明显更好,因为Array将是稀疏填充的。
<强>更新强>
感谢所有提供意见和反馈并帮助我学习的人。 @JohnnyO说明数组查找是O(1)
是正确的,我根据他的反馈纠正了我的帖子。我一直在想ArrayList。
答案 1 :(得分:1)
我会使用Map
,因为这正是它所做的。除此之外,使用Map
可能会使您的代码在将来更容易更新和管理。至于你应该使用哪种实现,在我看来HashMap
就足够了,尽管如果你想保持整数键的顺序,你可能还想考虑TreeMap
。
答案 2 :(得分:1)
该阵列显然会为您提供最快的访问权限,但如果您有这样的空白,您将浪费相当多的空间。
如果您正在寻找一个灵活的数据结构,将一个键(例如一个整数)与一个值相关联,那么该范围内可能存在间隙,您可能会在以后增加它,我想不出任何东西比地图更合适。如果您确切知道计划插入多少元素,则可能需要调查构造函数参数以实现HashMap等实现,这样可以将底层存储的大小调整为更小的空间而不是更少的冲突。
Map的另一个结果是,如果您需要使用它来执行其他面向集合的任务,您将获得更丰富的API。
答案 3 :(得分:1)
正如你所说,地图是一种很好的方式。我通常使用哈希映射,因为它非常快。虽然没有数组那么快。如果每个值只有一个键,您甚至可能希望使用HashSet,因为它将确保每个键只使用一个值。
android API有一个叫做SparseIntArray的东西应该具有更好的性能,但我还没有在标准的java API中看到它。
如果性能非常重要,您可能会发现特洛伊库具有适当的稀疏数组或映射。当你使用原语(在你的情况下你是)时,它往往会更快。
答案 4 :(得分:1)
你真正想要的是SparseArray。它是法线贴图和数组之间的折衷。
如果您正在为Android开发,可以使用一个(请参阅下面的链接)。否则,您可能会找到可用的实现。
http://developer.android.com/reference/android/util/SparseArray.html
答案 5 :(得分:0)
我推荐一张地图有一个原因:可变长度。跟踪您需要映射的对象可能会变得相当繁琐。使用HashMap
或类似的实现将保证您在映射对象中始终具有足够的容量。除此之外,使用Map更有意义,因为这是设计目的,使您的代码对其他人更具可读性。我想原始数组会占用更少的内存,但实际上,地图的开销对于你所谈论的尺度来说并不是非常重要。
答案 6 :(得分:0)
是否使用最快的可能性(数组)或HashMap
取决于您的应用程序。你每秒有数百万次计算(数组访问)吗?是的然后拿走阵列,花掉1k的内存
另外拿地图
但如果x很大,还有第三种解决方案:
此解决方案几乎与地图一样快(可能更快),但使用的空间更少:
使用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];
但是我会将此仅用于存储空间要求最小的大量对象,其中对象在运行时不会发生变化。