如果索引范围为long,则迭代数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果索引范围为long,则迭代数组相关的知识,希望对你有一定的参考价值。
如何在Java中迭代数组/列表。如果索引范围很长。由于数组/列表只接受位置索引中的整数。
例如
long arr[]=new long[5];
for(long i=0l;i<5l;i++)
arr[i]=i; // throw an error as arr[i] only accept integer
这里arr[i]
将抛出一个错误,因为我是long
类型,数组在索引位置输入integer
。
任何人都可以帮我解决这个问题吗?
数组上的大小limit1是Integer.MAX_VALUE
,因此数组索引是long
毫无意义。
List
可以拥有超过Integer.MAX_VALUE
元素,但索引它将是有问题的,因为List::get
采取int
论点。
因此,您将很难使用数组或列表(使用List
实现)来实现真正的大型数据结构。
解决方案......如果你真的需要一个...将实现你自己的List
类,带有重载或替代暴露大小和索引的操作。这不会是微不足道的。
另一种(可能更简单)的方法是将你的long[]
表示为long[][]
并映射下标。
最后,如果你不必要地使用long
作为下标(即索引不需要超出Integer.MAX_VALUE
),那么:
long arr[] = new long[5];
for (long i = 0l; i < 5l; i++) {
arr[(int) i] = i;
}
1 - 这是理论最大尺寸。 1)如果你试图分配一个大的数组,你可能会得到一个OutOfMemoryError
。 JVM至少需要length * size(<type>)
字节的自由连续存储来分配长度为<type>
的length
数组,其中size(<type>)
是基本类型或引用的大小。 2)在32位JVM中,您还受到地址空间维度的限制。 3)在最近的Hotspot JVM中,你可以分配的最大数组实际上是Integer.MAX_VALUE - 5
元素:参见Do Java arrays have a maximum size?
即使你的数组包含long
,你也不需要索引为long's
。将其更改为
for(int i = 0; ....)
两种解决方案
- 通过演员
long
将integer
缩小到arr[(int)i] = i;
- 将
i
的类型更改为integer
并让编译器在分配时为你扩展for(int i = 0; i < 5; i++) arr[i] = i;
由于无法将所有长值映射到整数,因此编译器不会自动缩小变量。由于您可以将所有整数值映射到long,编译器将自动为您扩展变量。
以上是关于如果索引范围为long,则迭代数组的主要内容,如果未能解决你的问题,请参考以下文章
如果两个 object.string 数组在 tableView 上相同,则尝试显示隐藏标签。但我一直让索引超出范围