2013-08-30 66 views
2

在Arraylist中添加新元素時,Java如何處理獲取新內存空間?例如,列表後面沒有可用空間。Arraylist中的Java內存分配

的Tx

+2

爲什麼不看源代碼!? – rocketboy

+0

這些是JVM本機調用。它沒有在Java中實現。 –

+3

因爲什麼時候ArrayList沒有在Java中實現? –

回答

2

所以,當你在ArrayList中添加元素在內部它調用下面的方法:

/** 
    * Increases the capacity of this <tt>ArrayList</tt> instance, if 
    * necessary, to ensure that it can hold at least the number of elements 
    * specified by the minimum capacity argument. 
    * 
    * @param minCapacity the desired minimum capacity 
    */ 
public void ensureCapacity(int minCapacity) { 
    modCount++; 
    int oldCapacity = elementData.length; 
    if (minCapacity > oldCapacity) { 
     Object oldData[] = elementData; 
     int newCapacity = (oldCapacity * 3)/2 + 1; 
      if (newCapacity < minCapacity) 
     newCapacity = minCapacity; 
      // minCapacity is usually close to size, so this is a win: 
      elementData = Arrays.copyOf(elementData, newCapacity); 
    } 
    } 

而且在上述方法中,Arrays.copyOf method進一步達到以下的本地方法,

public static native void arraycopy(Object src, int srcPos, 
             Object dest, int destPos, 
             int length); 

所以對於java,你必須看到openjdk原生方法代碼。

1

基本上,Java的ArrayList通常確保數組中有足夠的空間供元素適合。如果數組不夠長,那麼它爲它們提供了更多空間:使用原始數組的兩倍大小創建新數組,並將元素複製到其中。 (DEFAULT_CAPACITY = 10)

public void ensureCapacity(int minCapacity){ 

int current = data.length; 

if (minCapacity > current) 
    { 
    E[] newData = (E[]) new Object[Math.max(current * 2, minCapacity)]; 
    System.arraycopy(data, 0, newData, 0, size); 
    data = newData; 
    } 
} 

您可以從ArrayList中實施的ensureCapacity方法看到它:

http://developer.classpath.org/doc/java/util/ArrayList-source.html

如果不能提供足夠的空間,那麼它會拋出一個「的java.lang。的OutOfMemoryError:Java堆空間」

你可以在這裏檢查:http://javarevisited.blogspot.com/2011/09/javalangoutofmemoryerror-permgen-space.html