Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将对象映射为整数-使用数组还是映射?_Java_Arrays_Performance_Map_Integer - Fatal编程技术网

在Java中将对象映射为整数-使用数组还是映射?

在Java中将对象映射为整数-使用数组还是映射?,java,arrays,performance,map,integer,Java,Arrays,Performance,Map,Integer,我有需要映射到整数(或基本整数)的对象 比如说 Object[] objects = new Object[X]; objects[2]=o1; objects[34]=o2; objects[126]=o3; ... 所以我有一个范围从0到X的键,但只需要几个(比如说20个)映射对。 (映射只执行一次,不会更改) 使用映射(以及哪种实现最适合)而不是通常未使用的“大型”数组(性能和内存使用情况)是否更好 在开发过程中,所需的范围实际上可能会在后期扩大——因此,如果它只对非常大的X重要,那么对

我有需要映射到整数(或基本整数)的对象

比如说

Object[] objects = new Object[X];
objects[2]=o1;
objects[34]=o2;
objects[126]=o3;
...
所以我有一个范围从0到X的键,但只需要几个(比如说20个)映射对。 (映射只执行一次,不会更改)

使用映射(以及哪种实现最适合)而不是通常未使用的“大型”数组(性能和内存使用情况)是否更好

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


总而言之:我想在Java中有效地将数字映射到对象。

我会使用
映射,因为这才是它真正的用途。除此之外,使用
Map
可能会使您的代码在将来更易于更新和管理。至于你应该使用哪种实现,在我看来,一个就足够了,尽管如果你想保持你的整数键,你可能还想考虑一个.

这个数组显然会给你最快的访问,但是如果你有这样的间隙,你将浪费一个相当大的空间。 如果您正在寻找一种灵活的数据结构,将一个键(如整数)与一个值关联起来,在这个范围内可能会有间隙,以后可能会增加,那么我想不出比映射更合适的方法了。如果您确切地知道要插入多少个元素,那么可能需要研究诸如HashMap之类的实现的构造函数参数,它可以让您调整底层存储的大小,以减少空间和冲突

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

使用映射

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

但是,映射的内存使用情况将显著改善,因为数组将被稀疏填充

更新


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

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

正如您所说,贴图是一种很好的方法。我通常使用哈希映射,因为它非常快。但速度不如数组快。如果每个值只有一个键,您甚至可能希望使用哈希集,因为它将确保每个键只使用一个值

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


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

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

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


是否使用最快的可能性(数组)或
哈希映射取决于您的应用程序。每秒有数百万次计算(数组访问)吗?是,然后获取阵列,并花费1k内存。
Oherwise拿着地图。
但如果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];

但这一点我只会将其用于存储空间要求最低的大量对象,这些对象在运行时不会更改。

使用映射。这里没有太多要讨论的。数组:如果他按索引存储数据,数组查找将是O(1)。浪费在一个大部分为空的数组的内存占用中。@那么数组和映射将具有相同的查找,但由于内存的使用,映射应该是首选?哪种映射最适合处理整数?HashMap?@JohnnyO我同意为稀疏填充的数组浪费内存。@JohnnyO您对数组查找性能的看法是正确的,谢谢。@PhilipTenn您应该删除“使用映射性能会更好”有人找到了一个好的实现?(我不是为android开发的)android版本的源代码是Apache许可的,很容易找到(Google:SparseArray源代码),它可以很容易地适应您的需要这就是android中稀疏阵列的功能。。。我将进一步了解您自己可以做的事情,使用arraylist动态地构建最初的索引,然后进行排序,并创建固定的idx[]数组。准备好的