0

calls 是一个 arrayList,customerCalls 是一个 hashMap。我正在使用 eclipse 进行调试,我发现 call.clear 清除了已插入 customerCalls Hashmap 中的 arrayList 对象。我很困惑,因为我认为一旦对象被提交到另一个数据结构,它就有一个独立的实体,除非我访问包含它的这个数据结构,否则不能对其进行任何操作。

我需要清除 arrayList 调用,以使其免费用于一组新的调用,这些调用将专用于另一个合约,然后作为 hashmap 键(合约编号)的值插入。不清除它会累积所有调用,因为它将当前迭代添加到过去的迭代中。

>     if (callContractID.equals(currentContractID)==false){
>                               customerCalls.put(currentContractID, calls);
>                               currentContractID =  callContractID;
>                               calls.clear();
>                               calls.add(call);
>                               count++;
>     }
     else {

        calls.add(call);
         }
4

3 回答 3

2

我很困惑,因为我认为一旦对象被提交到另一个数据结构,它就有一个独立的实体,除非我访问包含它的这个数据结构,否则不能对其进行任何操作。

不。映射包含对对象的引用......就像您只是为它分配了另一个变量一样。您可以对同一个对象有很多引用,并且通过一个引用所做的任何更改都将通过其他任何引用看到。作为一个非常简单的例子:

StringBuilder b1 = new StringBuilder();
StringBuilder b2 = b1;
b2.append("foo");
System.out.println(b1); // Prints foo

集合也会发生同样的事情:

StringBuilder b1 = new StringBuilder();
List<StringBuilder> list = new List<StringBuilder>();
list.add(b1);

StringBuilder b2 = list.get(0);
// Now b1 and b2 are both reference to the same object...
b2.append("foo");
System.out.println(b1); // Prints foo
于 2013-09-30T20:15:11.153 回答
2

将对对象 A 的引用传递给另一个对象绝不会改变 A(当然,除非另一个对象显式调用 A 上的方法来更改其状态)。它不会产生 A 的独立副本,或使 A 不可变,或类似的东西。

听起来您要做的就是ArrayList在完成第一个并将其提交到地图后创建一个新的。

if (!callContractId.equals(currentContractID) {
    calls = new ArrayList<Call>(); // or whatever the type is
    // rest of your code...
}

calls这将使用对新的空的引用替换值ArrayList,您可以向其中添加新元素。旧的ArrayList仍可用于HashMap,因为地图有自己的第一个列表的引用副本。

于 2013-09-30T20:15:33.797 回答
1

一点也不。该对象尚未“提交”,它已被传递给另一个方法(碰巧这种方法已经制作了对对象引用的自己的副本。

对对象的所有引用都指向同一个对象,并且可能调用相同的方法。对象(通常)无法知道从哪里调用它。

于 2013-09-30T20:16:02.563 回答