gpt4 book ai didi

java - Java ArrayList.clear() 方法的行为是否一致?

转载 作者:行者123 更新时间:2023-12-01 07:23:02 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com