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