Java 清除已插入哈希映射的对象
calls是arrayList,customerCalls是hashMap。我正在使用eclipse和调用的fount进行调试。清除已插入customerCalls Hashmap中的arrayList对象。我感到困惑,因为我认为一旦对象被提交到另一个数据结构,它就有一个独立的实体,除非我访问包含它的数据结构,否则不能对它执行任何操作 我需要清除arrayList调用,使其可以自由地进行一组新的调用,这些调用将专用于另一个契约,并随后作为hashmap键(契约号)的值插入。不清除它会累积所有调用,因为它将当前迭代添加添加到过去的迭代添加中Java 清除已插入哈希映射的对象,java,oop,hashmap,Java,Oop,Hashmap,calls是arrayList,customerCalls是hashMap。我正在使用eclipse和调用的fount进行调试。清除已插入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);
}
我感到困惑,因为我认为一旦对象被提交到另一个数据结构,它就有一个独立的实体,除非我访问包含它的数据结构,否则不能对它执行任何操作
否。地图包含对某个对象的引用。。。就像你给它分配了另一个变量一样。您可以对同一对象有很多引用,通过一个引用所做的任何更改都将通过其他任何引用看到。作为一个非常简单的例子:
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
StringBuilder b1=新的StringBuilder();
列表=新列表();
列表。添加(b1);
StringBuilder b2=list.get(0);
//现在b1和b2都指向同一个对象。。。
b2.附加(“foo”);
系统输出打印Ln(b1);//印福
我感到困惑,因为我认为一旦对象被提交到另一个数据结构,它就有一个独立的实体,除非我访问包含它的数据结构,否则不能对它执行任何操作
否。地图包含对某个对象的引用。。。就像你给它分配了另一个变量一样。您可以对同一对象有很多引用,通过一个引用所做的任何更改都将通过其他任何引用看到。作为一个非常简单的例子:
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
StringBuilder b1=新的StringBuilder();
列表=新列表();
列表。添加(b1);
StringBuilder b2=list.get(0);
//现在b1和b2都指向同一个对象。。。
b2.附加(“foo”);
系统输出打印Ln(b1);//印福
将对对象a的引用传递给另一个对象不会改变a(当然,除非另一个对象显式调用a上的方法来更改其状态)。它不会产生一个独立的副本,或者生成一个不可变的,或者类似的东西
听起来你想做的就是在完成第一个并将其提交到地图后创建一个新的ArrayList
if (!callContractId.equals(currentContractID) {
calls = new ArrayList<Call>(); // or whatever the type is
// rest of your code...
}
if(!callconstrucd.equals(currentconstrucd){
calls=new ArrayList();//或任何类型
//剩下的代码。。。
}
这将用一个新的、空的
数组列表的引用替换调用的值,您可以将新元素添加到该列表中。旧的数组列表将仍然可用于HashMap
,因为该映射有它自己对第一个列表的引用副本。将对对象a的引用传递给另一个object决不会改变A(当然,除非另一个对象显式调用A上的方法来更改其状态)。它不会生成A的独立副本,也不会生成不可变的或类似的内容
听起来你想做的就是在完成第一个并将其提交到地图后创建一个新的ArrayList
if (!callContractId.equals(currentContractID) {
calls = new ArrayList<Call>(); // or whatever the type is
// rest of your code...
}
if(!callconstrucd.equals(currentconstrucd){
calls=new ArrayList();//或任何类型
//剩下的代码。。。
}
这将用一个新的、空的ArrayList
的引用替换calls
的值,您可以将新元素添加到该列表中。旧的ArrayList
仍将可用于HashMap
,因为该映射有它自己对第一个列表的引用副本。没有。该对象尚未“提交”,它已传递给另一个方法(碰巧该方法已创建了对该对象的引用的自己的副本)
对该对象的所有引用都指向同一个对象,并且可能调用相同的方法。该对象(通常)无法知道从何处调用它。一点也不。该对象尚未“提交”,它已传递给另一个方法(碰巧该方法已创建了对该对象引用的自己副本)
对对象的所有引用都指向同一个对象,并且可以调用相同的方法无法知道从何处调用它。因此,如果我在将旧数组列表提交到hashmap后构造新数组列表,我在调用时采取的任何操作都不会反映已经提交到hashmapCorrect的数组列表。这些操作将在调用当前引用的对象上进行,该对象现在是您可以调用的新列表已构建。因此,如果我在将旧的数组列表提交到hashmap后构建一个新的数组列表,我在调用时采取的任何操作都不会反映已经提交到hashmapCorrect的数组列表。这些操作将在调用的对象上进行,该对象当前引用的对象就是您构建的新列表。谢谢Jon。非常有益,非常有用像往常一样简单的插图:)谢谢你,乔恩。非常有益,像往常一样简单的插图:)