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

标签 java arraylist instance

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/

相关文章:

python - 如何使用 rdflib 实例化本体?

java - 从文本文件读取并创建对象数组 Java

Java ArrayList.remove() 不减少 ArrayList 的大小

java - 如何使用 ArrayList 编写 If 语句

java - eclipse 错误 - "Could Not Find Or Load Main Class"

java - 检查动态创建的类是否是一个 Activity

c# - 在 C# 中跟踪实例?

java - 这些 Java 约定中哪一个具有更高的优先级?

java - 什么是正则表达式 "independent non-capturing group"?

java - 我可以使用什么来代替实体 bean?