我相信LinkedLists和ArrayLists是有区别的。ArrayLists只不过是动态数组。因此,我假设ArrayLists存储在堆中的连续位置(这就是它们具有O(1) get方法的原因)。问题是,如果堆中存储了另一个阻止ArrayList增长的对象,该怎么办?在这种情况下它是如何实现的?如果ArrayList的其余部分存储在堆的其他非冲突区域中,则get方法将不是O(1)。
例如,假设在内存位置10有一个对象。之后,在内存位置5创建一个ArrayList。为简单起见,假设数组列表中的每个元素只有一个字节。这意味着ArrayList只能增长到5个元素。
发布于 2012-09-18 01:10:26
通过丢弃旧的数组,分配一个全新的数组,然后将旧数组中的值复制到新的数组中,ArrayList可以增长到受可用内存限制的任何大小。此操作可以对任何给定的插入(即amortized cost is O(1) )使用O(n)。
发布于 2012-09-18 01:08:43
所以我假设ArrayLists存储在堆中的连续位置
通常是这样的,但没有什么能阻止JVM做一些不同的事情( JVM规范中没有规定数组必须存储在连续的块中)。
另请参见this related post。
如果堆中存储了阻止ArrayList增长的另一个对象,该怎么办?
arraylist对象将请求JVM给它更多的空间,JVM将根据自己的意愿分配空间(如果不能,则抛出一个OutOfMemoryException )。
发布于 2012-09-18 01:14:17
查看源代码(感谢@GilbertoGaxiola),最初的ArrayList创建了一个大小为10的object[],因为它需要更多的空间,所以它将旧数组的大小加倍,并将旧数组的内容复制到新数组中。在这个数组变得巨大之前,它不需要填满很多次,这使得它成为一个很好的实现。
https://stackoverflow.com/questions/12464011
复制相似问题