2012-04-09 72 views
67
一个HashMap

我想保持一个包含类的临时容器件:复制Java中

HashMap<Integer,myObject> myobjectHashMap 

称为myobjectsList

则A类我做

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

则:向A中添加一些hashmap项(如2)

然后

myobjectListB = myobjectListA; //B has 2 

then:将散列表项添加到A; (如4个以上)

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

myobjectListA = myobjectListb; 

但是当我做这家B成长与阿而我加入HashMap的项目A. A现在有6个项目中,因为B的6

我想要一个有原来的2仍在最后一次assingment后 在C + +我会使用复制与对象,什么是java的等价物?

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

+1

一个[SSCCE(http://sscce.org),以得到更好的理解什么你到底做了什么? – assylias 2012-04-09 20:22:23

+2

您的对象应该实现Cloneable接口,否则分配如MyObjectB = MyObjectA只是告诉JVM两个变量指向内存中的相同位置。不是两个不同的对象。 – 2012-04-09 20:30:49

+0

顺便说一下,压倒性的习惯用法(实际上是一种法律)是为了使类名大写。这将使您的示例对我们这些人来说更具可读性,这些人在扫描示例代码时将这些东西用作快速线索。 – 2012-04-09 20:38:18

回答

2

在Java中,当你写:

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

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

但是,如果你写:

objectA = new Object() 

然后objectB仍然指向您创建的同时objectA现在指向一个新的对象的第一个对象(原objectA)。

+0

那解释问题,怎么解决?或者,这是Java的限制,没有解决方法? – user691305 2012-04-10 13:23:00

+1

这不是一个限制,它是它的工作方式。如果你想要2个不同的对象,你创建了2个对象 - 如果你只创建一个对象,那么所有指向该对象的变量都是相等的。 – assylias 2012-04-10 13:25:04

+0

我建议你用所有相关代码(最好是[SSCCE](http://sscce.org))创建一个新问题,并准确解释你正在努力实现的目标。 – assylias 2012-04-10 13:26:47

8

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

B = A

A和B都指向同一个对象。所以,任何你尽到一个做你到B,反之亦然

使用新的HashMap()如果你希望两个不同的对象

你也可以使用Map.putAll(...)两个地图之间复制数据

+0

就像说Java一样,C++有时是参考和有时候的价值吗?但我不想要一个HashMap,我不想复制我可以用作临时存储的类。 – user691305 2012-04-10 13:02:05

+0

我没有访问基类中的HashMap的权限。再次,我必须处理来自基础的类。我无法访问它中的HashMap。 – user691305 2012-04-10 13:24:50

0

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

如果您经常这样做,您可能会考虑在该类上实施clone()方法,该方法将创建相同类型的新对象,并将其所有内容复制到新对象中。

+0

克隆做了同样的事情,它似乎只是通过参考。 – user691305 2012-04-10 13:06:17

+0

另外,当增加HashMap计数时,副本也会执行,不要那样做。我需要相同类型的相关容器(在这种情况下是类)。 – user691305 2012-04-10 13:34:51

156

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

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

这将创建地图的(浅)副本。

+2

或者如果它已经创建,使用'myObjectListB.addAll(myObjectListA)' – 2012-04-09 20:36:08

+0

也许我不理解这一点,但我不需要地图的副本。我需要一个保存地图的类的副本。 ?对于myObjectListB必须是从MyojbectsList派生而不是散列表的类。 – user691305 2012-04-10 12:59:19

+0

另外我不明白“addAll(myOjbejctListA)” – user691305 2012-04-10 13:32:40

11

您还可以使用

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

+10

根据Joshua Bloch的Effective Java#11,你可以,但你可能不应该因为Cloneable基本上被破坏了。 – 2013-06-14 04:18:10

+8

也请注意,clone()返回一个浅拷贝。 – 2013-09-16 10:13:24

+2

浅甚至是什么意思?如果它没有完全复制地图(键/值完好),为什么要麻烦?不妨制作一张新地图吧? – Azurespot 2016-10-26 23:17:35

2

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

4

这里是小(巨大)轻描淡写。因为如果你想复制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"); 
    } 

所以basicaly,你需要你可以发布到自己的所有复制喜欢这里

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);