调用是一个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);
}
答案 0 :(得分: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
答案 1 :(得分:2)
将对象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
仍可供{{1}}使用,因为地图有自己的第一个列表参考副本。
答案 2 :(得分:1)
完全没有。该对象尚未“提交”,它已被传递给另一个方法(碰巧这种方法已经创建了自己的对象引用副本。
对象的所有引用都指向同一个对象,并且可以调用相同的方法。对象(通常)无法知道从哪里调用它。