用Java复制HashMap

我正在试图保留一个包含成员的类的临时容器:

HashMap<Integer,myObject> myobjectHashMap 

一个名为myobjectsList的类

那我呢

 myojbectsListA = new myojbectsList(); myojbectsListB = new myobjectsList(); 

然后:添加一些散列表项到A(like2)

然后

 myobjectListB = myobjectListA; //B has 2 

那么:将HashMap项目添加到A; (比如4个)

然后将A返回到B中存储的项目;

 myobjectListA = myobjectListb; 

但是当我这样做的时候B和A一起成长,而我正在向H中joinHashMap项目。现在有6个项目,因为B有6个项目。

我希望A有一个原始的2仍然在C ++的最后一次assingment结束后,我会用对象的副本,什么是Java的等价物?

增加:好的我留下了一些解释this.MyObjectsList不包含HashMap,它是从具有HashMap成员的MyBaseOjbectsList类和MyObjectsList扩展MyBaseOjbectsList派生。 这是否有所作为?

如果你想要一个HashMap的副本,你需要用一个新的构造一个。

 myobjectListB = new HashMap<Integer,myObject>(myobjectListA); 

这将创build一个(浅)的地图副本。

你也可以使用

 clone() 

将所有元素从一个hashmap复制到另一个hashmap的方法

将所有元素从一个hashmap复制到另一个的程序

 import java.util.HashMap; public class CloneHashMap { public static void main(String a[]) { HashMap hashMap = new HashMap(); HashMap hashMap1 = new HashMap(); hashMap.put(1, "One"); hashMap.put(2, "Two"); hashMap.put(3, "Three"); System.out.println("Original HashMap : " + hashMap); hashMap1 = (HashMap) hashMap.clone(); System.out.println("Copied HashMap : " + hashMap1); } } 

来源: http : //www.tutorialdata.com/examples/java/collection-framework/hashmap/copy-all-elements-from-one-hashmap-to-another

不同的是,在C ++中,对象位于堆栈上,而在Java中,对象位于堆栈中。 如果A和B是对象,随时在Java中你做

B = A

A和B指向SAME对象。 所以你对A做的任何事情你都对B做了,反之亦然

如果你想要两个不同的对象,使用新的HashMap()

您可以使用Map.putAll(…)在两个地图之间复制数据

这是小(大)的轻描淡写。 因为如果你想复制比较结构化的HashMap HashMap.putAll()将会处理这个值,因为它不知道如何完全复制你的对象。 例如

 private HashMap <Integer, HashMap<Integer,List<Float>>> DataA = new HashMap<>(); private HashMap <Integer, HashMap<Integer,List<Float>>> DataB = new HashMap<>(); DataA.put(1,new HashMap<>()); DataB.putAll(DataA); DataA.put(2,new HashMap<>()); if(DataB.size() == 2){ // true Log.i("","Sory object was copied - not the value"); } 

所以基本上你需要像这里一样复制一切

 List <Float> aX = new ArrayList<>(someList); List <Float> aY = new ArrayList<>(somteList1); List <Float> gX = new ArrayList<>(someList2); List <Float> gY = new ArrayList<>(someList3); HashMap<Integer,List<Float>> Map = new HashMap<>(); Map.put(X_axis,aX); Map.put(Y_axis,aY); Data.put(Sensor.TYPE_ACCELEROMETER,Map); HashMap<Integer,List<Float>> Map1 = new HashMap<>(); Map1.put(X_axis,gX); Map1.put(Y_axis,gY); Data.put(Sensor.TYPE_GYROSCOPE,Map1); 

在Java中,当你写:

 Object objectA = new Object(); Object objectB = objectA; 

objectAobjectB是相同的,并指向相同的引用。 改变一个会改变另一个。 所以如果你改变objectA的状态(不是它的引用), objectB也会反映这个改变。

但是,如果你写:

 objectA = new Object() 

然后, objectB仍然指向您创build的第一个对象(原始对象objectA ),而objectA现在指向一个新的对象。

由于这个问题还没有答案,我也有类似的问题,我会尽力回答这个问题。 这个问题(就像其他人已经提到过的一样)是,你只需要复制对同一个对象的引用,因此对副本的修改也会修改原始对象。 所以你必须要复制对象(你的地图值)本身。 最容易的方法是让所有的对象实现可序列化的接口。 然后序列化和反序列化你的地图来得到一个真正的副本。 你可以自己做,也可以使用你可以在这里find的apache commons SerializationUtils#clone(): https : //commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/ lang / SerializationUtils.html但请注意,这是最简单的方法,但是序列化和反序列化大量对象是一项昂贵的任务。

你将一个对象分配给另一个对象,你所做的只是把对象的引用复制到对象中,而不是复制对象的内容。 你需要做的是把你的对象B和手动复制对象A的内容到它。

如果你经常这样做,你可能会考虑在这个类上实现一个clone()方法,它将创build一个相同types的新对象,并将它的所有内容复制到新对象中。