问题 为什么java中的集合有int索引?


ArrayList(int initialCapacity)

和java中的其他集合一起工作 int 指数。

不可能有这样的情况 int 是 不够 可能需要 更多 范围 int

更新:  Java 10或其他一些版本必须为此开发新的Collection框架。正如使用 long 目前的收藏品会 打破 该 向后兼容。不是吗?


12021
2017-12-07 16:21


起源

如果它有超过2,147,483,647个项目,这是一个地狱的集合。 - Robert H
理论上@RobertH是可能的。所以我的问题更多的是对这个限制可能被打破的情况的疑惑。想象一下,添加一个元素会抛出 ArrayIndexOutOfBounds 例外。 - Narendra Pathai
毫无疑问它是 - 我只是说它是一个非常大的集合。我的猜测是,当最初设计JVM时,甚至不考虑这样大的数据集,但是根据应用程序,以及berry120提到它可能在Java 9中出现的事实,似乎对它的兴趣越来越大。我很想知道这些大型数据集与使用数据库相比会有什么样的表现。 - Robert H
@RobertH Java 10甚至,我的错误。是的,他们将来会考虑它 - 尽管实施的具体细节仍然模糊,但似乎对它的兴趣似乎越来越大。你当然是正确的,在JVM的概念上,没有人会梦想有如此大的集合,因此最初的限制。 - Michael Berry


答案:


理论上可以,但是目前JVM不支持这样大的数组(索引超出整数范围的数组),因此ArrayList也不支持它。

有必要吗?这不是问题本身的一部分,但似乎提出了很多,所以无论如何我都会解决它。简短的回答是在大多数情况下,不是,但在某些情况下,是的。一个值的上限值 int 在Java中 2,147,483,647,有点超过20亿。如果这是我们讨论的字节数组,那么就我们可以存储在数组中的字节数而言,上限略微超过2GB。回想一下Java的构思,并且对于典型的机器来说,内存比原本少一千倍,这显然不是一个问题 - 但现在即使是低端(台式机/笔记本电脑)机器也有更多记忆比这更好,更不用说一台大服务器了,所以很明显它不再是一个人无法达到的限制。 (是的,我们可以将字节打包成一个包装器对象并创建一个数组,但这不是我们在这里解决的问题。)如果我们切换到 long 数据类型,然后推动字节数组的上限超过9.2艾字节(超过90亿GB)。这使我们坚定地回到“我们不需要明显担心这个限制”领域至少可预见的未来。

那么,Java正在做出这种改变吗? Java 10的计划之一是解决“大数据”,这可能包括对数组的支持 long 基于索引。显然这还有很长的路要走,但甲骨文至少是这样 考虑此事

JDK 9的表格是让Java虚拟机(JVM)管理程序感知并提高其性能的举措,而JDK 10可以从32位移动到64位可寻址阵列以获得更大的数据集。

理论上你可以通过使用你自己的集合类来解决这个限制,这些集合类使用多个数组来存储它们的数据,从而绕过了一个隐含的限制。 int  - 所以如果你现在真的需要这个功能,有点可能,目前只是相当混乱。

在此功能进入时,在向后兼容性方面?嗯,你显然不能只改变所有 intlongs,那里需要更多样板,并且根据实现选择,甚至可能是这些大型集合的新集合类型(考虑到我怀疑它们已经找到了进入大多数Java代码的方法,这可能是最好的选择。 )无论如何,关键在于虽然向后兼容性当然是一个问题,但是有很多潜在的方法可以解决这个问题,所以它不是任何想象力的显示阻止。


13
2017-12-07 16:22



是的,我的问题或多或少都在同一个思路中。当必须在java中创建一些大数据应用程序时会发生什么。 - Narendra Pathai
@NarendraPathai查看编辑,您将使用自己的自定义实现(或找到已经存在的实现),这些实现使用多个数组来存储数据。但是标准Java库中没有任何东西。 - Michael Berry
scala是否支持如此庞大的索引? - Narendra Pathai
@NarendraPathai我不相信,我认为这是目前VM的限制(Scala继续运行。)他们可能会做一些诡计来解决这个问题,但目前我不认为他们这样做。 - Michael Berry
@ berry120:是的。 “对于每个人来说,2G应该足够了。” :-) - Martin Schröder


实际上你是对的,像Array这样的集合目前仅支持int值,但是如果你想绕过这个约束,你可以使用Maps和Sets,其中Key可以是你想要的任何东西,因此,你可以拥有尽可能多的条目。但我个人认为int值对于像数组这样的结构来说已经足够了,但如果我想获得更多,我想我会使用Derby表,在这种情况下数据库变得更有用。


2
2017-12-07 16:33



是的,我可以,但有时您可能需要在内存中拥有如此大量的数据 - Narendra Pathai
错误!您不能拥有任意数量的条目。 - nullpotent