4

为什么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]; 
}
4

1 回答 1

3

您希望将每个元素显式设置为nullin的原因clear()是,否则您可能会引入某种形式的内存泄漏。也就是说,elements[]数组可以保留对对象的引用并防止它们被垃圾收集。

您从头开始重新创建数组的替代方法会起作用(我认为您错过了一个new),但是分配一块新的内存通常比清除您已经分配的内存要慢。

于 2018-05-22T17:26:24.283 回答