在get()上有没有克隆值的Java上的Map

Dek*_*eka -2 java map

我们已经知道,当我们从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)

Jon*_*eet 7

我们已经知道,当我们从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"两次,与问题中的声明相反.

想必你已经有了代码有点像你的示例代码,从而产生不同的输出,我们不能用你的代码复制已经提供.您应该仔细检查您的真实代码,以找出它与您提供的内容之间的差异.默认情况下,任何标准集合都不会发生克隆.

  • @Deka:当你说"它已经发生了很大变化"时 - Java在这方面根本没有改变.如果你的意思是"Java与C++非常不同"那么你就是对的......你应该总是验证你的假设. (2认同)