nst*_*sic 23 java memory android arraylist
如果我没弄错的话,ArrayList包含存储位置的值,在这些位置中存储了你添加到List中的变量.所以,我的假设是,当你调用ArrayList.clear()方法时,它只释放上述值(内存位置)但不释放这些内存位置本身.我将尝试用一个例子来说明这一点:
假设您已拥有内存的当前状态:
[Memory location] (type of variable) *value*
[1000] (int) 32
[1002] (int) 12
[1003] (float) 2.5
Run Code Online (Sandbox Code Playgroud)
然后将它们添加到列表myList中,因此它包含指向1000,1002,1003内存位置的指针.
当您调用myList.clear()时,指针将无效,但内存位置1000,1002,1003仍将包含先前给定的值.我错了吗?
Kar*_*k T 13
你是对的,因为内存是由垃圾收集器异步清除的,而不是由这些库函数直接清除.clear只会null全部出局,并相应地更新ArrayList状态.
如果任何或所有这些元素未被代码的任何其他部分引用,则它们有资格进行垃圾收集,并且可能在该调用之后不久的任何时间被销毁或取消分配.
clear 仅支持数组元素
public void clear() {
modCount++;
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
但如果我们调用ArrayList.trimToSize after clear支持数组将收缩
public void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
Run Code Online (Sandbox Code Playgroud)
不,它不会清除记忆clear().在你之后.
查看clear()的源代码
public void More ...clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
该方法使元素符合垃圾收集器的条件.不立即清除它们.一旦GC运行,它们就消失了.