Java 中的clear() 方法是否将 ArrayList 中的元素清空,或者只是释放其引用并使值保持 Activity 状态。
我将 ArrayList 中的所有对象分配给另一个对象,然后清除它。清除它后,分配给另一个对象的引用会给出不一致的结果。另一方面,如果我创建一个新的 ArrayList 对象而不是清除它,它就可以正常工作。
ArrayList <Condition> conditionList = new ArrayList<Condition>();
Risk riskObject = new Risk();
for (int i =0; i<10; i++) {
if(some-condition){
addElemetsToConditionList();
}else{
addElemetsToConditionList();
riskObject.setConditions(conditionList); // Setter which sets condition list to risk object.
Risk newRiskObject = new Risk();
riskObject = newRiskObject;
// conditionList = new ArrayList<Condition>();
conditionList.clear();
}
}
最佳答案
在内部,它会将其后备缓冲区中的所有元素null
(删除其拥有的引用)并将其大小设置为0
/**
* Removes all of the elements from this list. The list will
* be empty after this call returns.
*/
public void clear() {
modCount++;
// clear to let GC do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
您可能对外部数据的任何引用仍然有效,只是 ArrayList
不再维护对它们的引用
我相信你的问题就在这里......
riskObject.setConditions(conditionList);
您将 ArrayList
的实例传递给 riskObject
,然后清除它,它共享同一个实例。
相反,您可以创建 ArrayList
的新实例
riskObject.setConditions(new ArrayList(conditionList));
这会复制 conditionList
的内容,因此当您清除它时,传递给 riskObject
的引用将不会受到影响,或者,正如您所看到的那样已经完成,创建一个新的 ArrayList
来继续处理,这对您来说似乎是最合乎逻辑的。
关于java - Java ArrayList.clear() 方法的行为是否一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30907115/