Метод clear() в ArrayDeque

Почему в ArrayDeque чтобы очистить этот, используя (1)do-while для удаления каждого элемента, вместо этого создайте новый массив с начальным размером и (2) перезаписайте массив, где содержатся элементы?

(1)

public void clear() {
    int h = head;
    int t = tail;
    if (h != t) { // clear all cells
        head = tail = 0;
        int i = h;
        int mask = elements.length - 1;
        do {
            elements[i] = null;
            i = (i + 1) & mask;
        } while (i != t);
    }
}

(2)

public void clear() {
     head = tail = 0;
     elements = null;
     elements = (T[]) Object[START_SIZE]; 
}

1 ответ

Решение

Причина, по которой вы хотите явно установить каждый элемент null в clear() в том, что в противном случае вы могли бы ввести форму утечки памяти. Это elements[] массив может содержать ссылки на объекты и предотвращать их сборку мусора.

Ваш вариант воссоздания массива с нуля будет работать (я думаю, что вы пропускаете new хотя), но выделение нового фрагмента памяти обычно медленнее, чем очистка уже выделенного фрагмента.

Другие вопросы по тегам