在Java中复制哈希映射

在Java中复制哈希映射,java,copy,hashmap,clone,Java,Copy,Hashmap,Clone,我试图保留一个类的临时容器,该类包含以下成员: HashMap<Integer,myObject> myobjectHashMap 然后:将一些hashmap项添加到(如2) 然后: 然后:将hashmap项添加到一个(如4个以上) 然后:将A返回到存储在B中的项目 myobjectListA = myobjectListb; 但当我这样做时,当我向A添加hashmap项时,B会随着时间的推移而增长。 A现在有6项,因为B有6项 我希望A在上次作业结束后仍保留原来的2。 在C++

我试图保留一个类的临时容器,该类包含以下成员:

HashMap<Integer,myObject> myobjectHashMap
然后:将一些hashmap项添加到(如2)

然后:

然后:将hashmap项添加到一个(如4个以上)

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

myobjectListA = myobjectListb;
但当我这样做时,当我向A添加hashmap项时,B会随着时间的推移而增长。 A现在有6项,因为B有6项

我希望A在上次作业结束后仍保留原来的2。 在C++中,我会使用拷贝和对象,java等价什么?< /p>
补充:好的,我遗漏了一些解释
MyObjectsList
不包含HashMap,它派生自一个类
MyBaseOjbectsList
,该类具有HashMap成员和
MyObjectsList
扩展
MyBaseOjbectsList
。这有什么不同吗?

在Java中,当您编写:

Object objectA = new Object();
Object objectB = objectA;
objectA = new Object()
objectA
objectB
是相同的,并且指向相同的引用。改变一个会改变另一个。因此,如果更改
objectA
(不是其引用)的状态,
objectB
也将反映该更改

但是,如果你写:

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

<> >代码> ObjutbB/Cuth>仍然指向您创建的第一个对象(原代码<代码> Objuta<代码>),而<>代码> Objuta现在指向一个新对象。

< P>区别在于C++中的对象在堆栈上,而在java中,对象位于堆中。如果A和B是对象,在Java中,您可以随时执行以下操作:

B=A
A和B指向同一个对象,所以对A做的任何事情都对B做,反之亦然

如果需要两个不同的对象,请使用new
HashMap()


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

将一个对象指定给另一个对象时,您所做的只是复制对该对象的引用,而不是复制其内容。您需要做的是获取对象B并手动将对象A的内容复制到其中


如果您经常这样做,您可能会考虑在类上创建一个<代码> Cube()/<代码>方法,该类将创建同一类型的新对象,并将其所有内容复制到新对象中。

< P>如果您需要一个哈希映射的副本,则需要用.</P>构造一个新的HasMax。
myobjectListB = new HashMap<Integer,myObject>(myobjectListA);
myobjectListB=新HashMap(myobjectListA);
这将创建地图的(浅)副本。

您也可以使用

clone()
方法将所有元素从一个hashmap复制到另一个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);    
    }    
}

来源:

由于这个问题仍然没有答案,而且我也有类似的问题,我将尝试回答这个问题。问题(正如其他人已经提到的)是,您只需复制对同一对象的引用,因此对副本的修改也将修改原始对象。因此,您必须复制对象(贴图值)本身。最简单的方法是让所有对象实现可序列化接口。然后序列化和反序列化地图以获得真实副本。您可以自己完成这项工作,也可以使用apache commons SerializationUtils#clone(),您可以在这里找到它:但请注意,这是最简单的方法,但对许多对象进行序列化和反序列化是一项昂贵的任务。

这里有一个小(大)的轻描淡写。如果要复制具有嵌套结构的
HashMap
HashMap.putAll()
将通过引用进行复制,因为它不知道如何准确复制对象

import java.util.*;
班级操场{
公共静态void main(字符串[]args){
Map dataA=新的HashMap();
Map-dataB=新的HashMap();
put(1,newhashmap());
dataB.putAll(dataA);
断言(dataB.get(1.size()==0);
get(1.put(2,newarraylist());
如果(dataB.get(1).size()==1){//true
System.out.println(
“对不起,复制了对象引用-不是值”);
}
}
}
所以基本上你需要像这里一样自己复制字段

List <Float> aX = new ArrayList<>(accelerometerReadingsX);
List <Float> aY = new ArrayList<>(accelerometerReadingsY);

List <Float> gX = new ArrayList<>(gyroscopeReadingsX);
List <Float> gY = new ArrayList<>(gyroscopeReadingsY);

Map<Integer, Map<Integer, Float>> readings = new HashMap<>();

Map<Integer,List<Float>> accelerometerReadings = new HashMap<>();
accelerometerReadings.put(X_axis, aX);
accelerometerReadings.put(Y_axis, aY);
readings.put(Sensor.TYPE_ACCELEROMETER, accelerometerReadings);

Map<Integer,List<Float>> gyroscopeReadings = new HashMap<>();
gyroscopeReadings.put(X_axis, gX);
gyroscopeReadings.put(Y_axis, gY);
readings.put(Sensor.TYPE_GYROSCOPE, gyroscopeReadings);
List aX=新阵列列表(AccelerometerRadingsx);
列表aY=新阵列列表(加速度计READINGSY);
List gX=新阵列列表(陀螺读数X);
列表gY=新阵列列表(陀螺仪读数Y);
映射读数=新的HashMap();
Map accelerometerReadings=新HashMap();
加速计调整位置(X_轴,aX);
加速计调整位置(Y_轴,aY);
读数.put(传感器类型\加速计、加速计读数);
Map=newhashmap();
陀螺仪读数。放置(X_轴,gX);
陀螺仪读数。放置(Y_轴,gY);
读数.put(传感器、U型陀螺仪、陀螺仪读数);

因为OP提到他没有访问基类的权限,基类中有一个HashMap——我恐怕只有很少的选项可用

在Java中执行对象的深度复制的一种(速度非常慢且资源密集)方法是滥用许多类有意或无意扩展的“可序列化”接口,然后利用该接口将类序列化为ByTestStream。反序列化后,您将拥有相关对象的深度副本


可以在这里找到相关指南:

如果我们想在Java中复制对象,我们需要考虑两种可能性:浅拷贝深拷贝

浅拷贝是我们仅拷贝字段值的方法。因此,副本可能依赖于原始对象。在深度复制方法中,我们确保树中的所有对象都被深度复制,因此复制不依赖于任何可能发生更改的早期现有对象

这个问题是应用深度复制方法的完美定义

首先,如果您有一个简单的
HashMap
map,那么我们就创建一个类似这样的解决方法。创建
列表的新实例

publicstatichashma
List <Float> aX = new ArrayList<>(accelerometerReadingsX);
List <Float> aY = new ArrayList<>(accelerometerReadingsY);

List <Float> gX = new ArrayList<>(gyroscopeReadingsX);
List <Float> gY = new ArrayList<>(gyroscopeReadingsY);

Map<Integer, Map<Integer, Float>> readings = new HashMap<>();

Map<Integer,List<Float>> accelerometerReadings = new HashMap<>();
accelerometerReadings.put(X_axis, aX);
accelerometerReadings.put(Y_axis, aY);
readings.put(Sensor.TYPE_ACCELEROMETER, accelerometerReadings);

Map<Integer,List<Float>> gyroscopeReadings = new HashMap<>();
gyroscopeReadings.put(X_axis, gX);
gyroscopeReadings.put(Y_axis, gY);
readings.put(Sensor.TYPE_GYROSCOPE, gyroscopeReadings);
Map.copyOf