清除已插入到散列映射的对象

时间:2013-09-30 20:11:39

标签: java oop hashmap

调用是一个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);
         }

3 个答案:

答案 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)

完全没有。该对象尚未“提交”,它已被传递给另一个方法(碰巧这种方法已经创建了自己的对象引用副本。

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