我们已经知道,当我们从Map获取元素时,元素的值将被克隆,例如:
Map<String, MyObject> map = new HashMap();
MyObject obj = new MyObject();
//put
map.put("id1", obj);
//get
MyObject obj1 = map.get("id1");
MyObject obj2 = map.get("id1"); //"obj2" is only a clone of "obj1"
//change some things
obj1.setName("AAA");
obj2.setName("BBB");
//show: they are different
obj1.printName(); //Print: AAA
obj2.printName(); //Print: BBB
Run Code Online (Sandbox Code Playgroud)
但是,我想要一个返回原始实例的Map,是否有类似的Map?
Map<String, MyObject> map = new AUnknownMap();
MyObject obj = new MyObject();
//put
map.put("id1", obj);
//get
MyObject obj1 = map.get("id1");
MyObject obj2 = map.get("id1"); //"obj2" and "obj1" refer the same instance
//change some things
obj1.setName("AAA");
obj2.setName("BBB");
//show: they are the same
obj1.printName(); //Print: BBB
obj2.printName(); //Print: BBB
Run Code Online (Sandbox Code Playgroud)
我们已经知道,当我们从Map获取元素时,元素的值将被克隆
不,它不会.目前还不清楚你是如何看到原始输出的,但这不是正常的行为.
以下是基于您的代码的简短但完整的示例:
import java.util.HashMap;
import java.util.Map;
class MyObject {
private String name;
public void setName(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
class Test {
public static void main(String[] args) throws Exception {
Map<String, MyObject> map = new HashMap<>();
MyObject obj1 = new MyObject();
map.put("id1", obj1);
MyObject obj2 = map.get("id1");
obj1.setName("AAA");
obj2.setName("BBB");
obj1.printName();
obj2.printName();
}
}
Run Code Online (Sandbox Code Playgroud)
这打印"BBB"两次,与问题中的声明相反.
想必你已经有了代码有点像你的示例代码,从而产生不同的输出,我们不能用你的代码复制已经提供.您应该仔细检查您的真实代码,以找出它与您提供的内容之间的差异.默认情况下,任何标准集合都不会发生克隆.