2013-08-30 5 views
2

Как обработчик java получает новое пространство памяти при добавлении нового элемента в Arraylist? Например, после списка нет свободного места.Распределение памяти Java в Arraylist

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

В основном, ArrayList Java обычно обеспечивает достаточное пространство в массиве для соответствия элементов. Если массив недостаточно длинный, он предоставляет им больше места: создайте новый массив с двойным размером исходного массива и скопируйте в него элементы. (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; 
    } 
} 

Вы можете увидеть его от метода реализации ensureCapacity из Arraylist:

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

Если он не может обеспечить достаточно места, то это будет бросать «java.lang. OutOfMemoryError: Java куча пространства»

Вы можете проверить это здесь: http://javarevisited.blogspot.com/2011/09/javalangoutofmemoryerror-permgen-space.html

Смежные вопросы