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

时间:2012-12-07 16:21:43

标签: java collections

ArrayList(int initialCapacity)

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

int 不够并且可能需要 范围int

更新  Java 10或其他一些版本必须为此开发新的Collection框架。使用带有现有收藏集的long 打破 向后兼容性。不是吗?

2 个答案:

答案 0 :(得分:13)

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

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

那么,Java是否正在进行此更改? Java 10的计划之一是解决“大数据”,这可能包括对基于long的索引的数组的支持。显然这还有很长的路要走,但Oracle至少是thinking about it

  

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

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

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

答案 1 :(得分:2)

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