метод clear () в ArrayDeque - PullRequest
0 голосов
/ 22 мая 2018

Почему в 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 Ответ

0 голосов
/ 22 мая 2018

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

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

...