Java 8 ArrayList作为Java 8中List的一个n实现

Java 8 ArrayList作为Java 8中List的一个n实现,java-8,Java 8,可以使用java.util.ArrayList作为java.util.List集合的实现,方法是: 列表L=新的ArrayList() 参考上面的场景,添加超过ArrayList容量的元素时会发生什么情况?ArrayList的容量取决于可用的堆内存 如果调用ArrayList.add时没有更多的堆空间可用,将抛出OutOfMemoryError您的问题有几种情况: 您有足够的内存来保存原始阵列和较大的副本 然后,通常情况下,容量会自动增加,您可以添加更多元素 您可以使用的堆内存很少。 在这种情况

可以使用java.util.ArrayList作为java.util.List集合的实现,方法是:

列表L=新的ArrayList()


参考上面的场景,添加超过ArrayList容量的元素时会发生什么情况?

ArrayList的容量取决于可用的堆内存


如果调用ArrayList.add时没有更多的堆空间可用,将抛出OutOfMemoryError

您的问题有几种情况:

您有足够的内存来保存原始阵列和较大的副本 然后,通常情况下,容量会自动增加,您可以添加更多元素

您可以使用的堆内存很少。 在这种情况下,当
ArrayList
尝试创建容量更大的内部数组副本时,您将得到一个
OutOfMemoryError

您已经有了大约
Integer.MAX_VALUE-8的容量,并且您有足够的堆内存来创建更大的数组。

然后,如果您使用的是Hotspot/OpenJDK JVM,您将得到一个
OutOfMemoryError
。在
列表
接口或其实现中没有记录它,但根据实现的测试(见注释),这是您得到的,因为创建一个大小
整数的数组。MAX_值
会引发这样的错误。其他JVM可能会抛出其他异常或错误。

容量会自动增加。永远不要使用原始类型。我会记住。谢谢。全部都是:“当元素添加到ArrayList时,它的容量会自动增长”。获奖者阅读文档。在添加
Integer.MAX_值+1
处的元素之前,您需要一个
ArrayList
大小为
Integer.MAX_值
,这在OpenJDK中是不可能的,因为数组不能具有该大小,尝试创建该大小的数组将导致
OutOfMemoryError
,所以你永远不会达到那个地步。链接的代码甚至有这样一条注释:“尝试分配更大的数组可能会导致OutOfMemoryError:请求的数组大小超过VM限制”。@Holger您是对的,但是。。。你所引用的只是解释他们为什么使用
Integer.MAX\u VALUE-8
(因为它可能会抛出
OutOfMemoryException
),而不是保证会抛出OOME。我将在我的答案中修复唯一需要修复的部分(我没有思考就把它搞糟了)。如果
大小
不是
整数,为什么尝试添加
大小+1
的元素会导致
IndexOutOufBoundException
?仅供参考,我甚至实际验证过,在这样大的容量下,您永远不会得到
indexoutufboundexception
Integer.MAX_值-8
将在增长接近此阈值时用作安全容量;一旦达到该值,此代码将完全使用
Integer.MAX_VALUE
作为新容量,它将始终失败,并带有
java.lang.OutOfMemoryError:请求的数组大小超过HotSpot/OpenJDK上的VM限制。@Holger好的,我认为测试是理所当然的。