为什么在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];
}
答案 0 :(得分:3)
您希望在null
中将每个元素显式设置为clear()
的原因是,否则您可能会引入一种内存泄漏形式。也就是说,elements[]
数组可以保留对对象的引用并防止它们被垃圾回收。
你可以选择从头开始重新创建数组(我认为你错过了new
),但是分配一大块内存通常比清除你已经存在的内存慢一些被分配了。