Как обработчик java получает новое пространство памяти при добавлении нового элемента в Arraylist? Например, после списка нет свободного места.Распределение памяти Java в Arraylist
Tx
Как обработчик java получает новое пространство памяти при добавлении нового элемента в Arraylist? Например, после списка нет свободного места.Распределение памяти Java в Arraylist
Tx
Итак, когда вы добавляете элемент в 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
собственный код метода.
В основном, 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
почему бы не посмотреть на исходный код !? – rocketboy
Это обычные вызовы JVM. Он не реализован на Java. –
С каких пор 'ArrayList' не реализован в Java? –