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

Nar*_*hai 11 java collections

ArrayList(int initialCapacity)
Run Code Online (Sandbox Code Playgroud)

和java中的其他集合在int索引上工作.

不能有是哪里的情况下int不够的,有可能需要超过范围int

更新: Java 10或其他一些版本必须为此开发新的Collection框架.作为使用long与存在类别将打破向后兼容性.不是吗?

Mic*_*rry 13

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

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

那么,Java正在做出这种改变吗?Java 10的计划之一是解决"大数据",这可能包括对long基于索引的数组的支持.显然这还有很长的路要走,但Oracle至少在考虑它:

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

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

在此功能进入时,在向后兼容性方面?那么你显然不能只是改变所有的ints到longs时,将需要一些更多的样板那里,这取决于实现的选择,对于这些大集合甚至是新的集合类型(考虑到我怀疑他们会找到自己的方式进入大多数Java代码,这可能是最好的选择.)无论如何,关键在于虽然向后兼容当然是一个问题,但是有许多潜在的方法可以解决这个问题,所以它不是任何想象力的显示阻止.