11
ArrayList(int initialCapacity)

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

不能有一些情况int不够可能需要超过范围int吗?

更新: Java 10 或其他版本必须为此开发新的 Collection 框架。long与当前集合一起使用会破坏向后兼容性。不是吗?

4

2 回答 2

13

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

有必要吗?这本身不是问题的一部分,但似乎出现了很多,所以无论如何我都会解决它。简短的回答是在大多数情况下,不,但在某些情况下,是的。intJava中an的上限值是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 位可寻址数组以用于更大的数据集。

从理论上讲,您可以通过使用您自己的集合类来解决此限制,该集合类使用多个数组来存储其数据,从而绕过 an 的隐式限制int- 因此,如果您现在真的需要此功能,这在某种程度上是可能的,只是目前相当混乱。

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

于 2012-12-07T16:22:23.763 回答
2

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

于 2012-12-07T16:33:27.253 回答