Java HashMap自动值复制问题

Java HashMap自动值复制问题,java,hashmap,Java,Hashmap,每当我开始设置HashMaps时,值都会被复制。我相信在初始化HashMap时,我不理解一些Java规则。下面是我的哈希映射的DTO public class ClientsByMonth { private int pax; private int folios; private int totalStays; private HashMap<String, Integer> byCountry = new HashMap<>(); private HashMap

每当我开始设置HashMaps时,值都会被复制。我相信在初始化HashMap时,我不理解一些Java规则。下面是我的哈希映射的DTO

public class ClientsByMonth {
private int pax;
private int folios;
private int totalStays;
private HashMap<String, Integer> byCountry = new HashMap<>();   
private HashMap<String, Integer> groups = new HashMap<>();
public class CMBSetter{ 
private HashMap<Integer, Clients> clients = new HashMap<>();
private HashMap<Integer, ClientsByMonth> clientsBM = new HashMap<>();

 public void preSetterList(){
    // ----     --- COUNTRY SETTER ---      ----
     HashMap<String, Integer> byCountry = new HashMap();

    String[] countrys = {"GB ", "PT ", "ES ", "BE ", "IE ", "FR ", "DE ", "CH ", "IR ", "NL ", "   ", "Others"};
    for(int i = 0; i < 12; i++){
        byCountry.put(countrys[i], 0);

    }
    //  ****    *** GROUPS SETTER ***   ****
    HashMap<String, Integer> groups = new HashMap<>();
    Collection<String> keysGroup = groups.keySet();
    groups.put("test", 0);

    Collection<Integer> keysCleint = clients.keySet();

    for(Integer keyC: keysCleint){            
        String groupNameClient = clients.get(keyC).getGroupName();
        boolean namefound = false;

        for(String keyG: keysGroup){
            if(groupNameClient.equals(keyG)){
                namefound = true;
            }  
        }
        if(!namefound){
        groups.put(groupNameClient, 0);
        } 
    }
     //  _)_)_)_   )_)_  DTO SETTER )_)_   _)_)_)_

    for(int i = 0; i < 12; i++){

        clientsBM.put(i, new ClientsByMonth());
        clientsBM.get(i).setByCountry(byCountry[i]);
        clientsBM.get(i).setGroups(groups);
    }
}
公共类ClientsByMonth{
私人国际机场;
私人对账单;
私人住宿;
private HashMap byCountry=新HashMap();
私有HashMap组=新HashMap();
下面是我初始化HashMaps的地方

public class ClientsByMonth {
private int pax;
private int folios;
private int totalStays;
private HashMap<String, Integer> byCountry = new HashMap<>();   
private HashMap<String, Integer> groups = new HashMap<>();
public class CMBSetter{ 
private HashMap<Integer, Clients> clients = new HashMap<>();
private HashMap<Integer, ClientsByMonth> clientsBM = new HashMap<>();

 public void preSetterList(){
    // ----     --- COUNTRY SETTER ---      ----
     HashMap<String, Integer> byCountry = new HashMap();

    String[] countrys = {"GB ", "PT ", "ES ", "BE ", "IE ", "FR ", "DE ", "CH ", "IR ", "NL ", "   ", "Others"};
    for(int i = 0; i < 12; i++){
        byCountry.put(countrys[i], 0);

    }
    //  ****    *** GROUPS SETTER ***   ****
    HashMap<String, Integer> groups = new HashMap<>();
    Collection<String> keysGroup = groups.keySet();
    groups.put("test", 0);

    Collection<Integer> keysCleint = clients.keySet();

    for(Integer keyC: keysCleint){            
        String groupNameClient = clients.get(keyC).getGroupName();
        boolean namefound = false;

        for(String keyG: keysGroup){
            if(groupNameClient.equals(keyG)){
                namefound = true;
            }  
        }
        if(!namefound){
        groups.put(groupNameClient, 0);
        } 
    }
     //  _)_)_)_   )_)_  DTO SETTER )_)_   _)_)_)_

    for(int i = 0; i < 12; i++){

        clientsBM.put(i, new ClientsByMonth());
        clientsBM.get(i).setByCountry(byCountry[i]);
        clientsBM.get(i).setGroups(groups);
    }
}
公共类CMBSetter{
私有HashMap客户端=新HashMap();
private HashMap clientsBM=new HashMap();
公共void预设置列表(){
//----国家设定者--------
HashMap byCountry=新HashMap();
字符串[]country={“GB”、“PT”、“ES”、“BE”、“IE”、“FR”、“DE”、“CH”、“IR”、“NL”、“其他”};
对于(int i=0;i<12;i++){
byCountry.put(countrys[i],0);
}
//******组设置器*******
HashMap组=新的HashMap();
集合keysGroup=groups.keySet();
组。放置(“测试”,0);
集合keysCleint=clients.keySet();
对于(整数keyC:keysCleint){
字符串groupNameClient=clients.get(keyC.getGroupName();
布尔namefound=false;
for(字符串键:键组){
if(groupNameClient.equals(keyG)){
namefound=true;
}  
}
如果(!namefound){
groups.put(groupNameClient,0);
} 
}
//)!!!!!!!!!!!!!!!!!!!!!_
对于(int i=0;i<12;i++){
clientsBM.put(i,newclientsbymonth());
clientsBM.get(i).setByCountry(按国家[i]);
clientsBM.get(i).setGroups(groups);
}
}
我的问题:

如何初始化哈希映射,以便在设置值时不会复制它们? 如何在不发生此问题的情况下初始化哈希映射

我想做什么:

I.E.2-我想在我的DTO客户端ByMonth中填写我的byCountry HashMap的国家数组,例如(“GB”,0)和(“IR”,0)和(“DE”,0)

I.E.2-我希望Groups setter遍历客户端HashMap,并将GroupName()下存在的所有名称存储在我的新HashMap中,该HashMap具有一个带有HashMap的DTO对象。值,例如HashMap组(位,0)和(预订,0)和(TRVLFAR,0)

我首先在HashMap中创建(预设)所有“标签/键”,因为当我尝试在空的HashMap上迭代时,总是出现空指针错误。

解决方案 从评论中

Joop Eggen


一个初学者在做以下事情时的陷阱 clientsBM.get(i).setGroups(groups);您现在正在共享 对象由组保留。之后对组的任何更改将保留 所有客户BM.get(一)

heniv181

我首先创建(预设)HashMap中的所有“标签/键” 因为当我尝试迭代时,总是出现空指针错误 使用键集中的迭代器来避免 打空

解决方案 从评论中

Joop Eggen


一个初学者在做以下事情时的陷阱 clientsBM.get(i).setGroups(groups);您现在正在共享 对象由组保留。之后对组的任何更改将保留 所有客户BM.get(一)

heniv181

我首先创建(预设)HashMap中的所有“标签/键” 因为当我尝试迭代时,总是出现空指针错误 使用键集中的迭代器来避免 打空


您到底想实现什么?
HashMap[]byCountry
创建一个哈希映射数组,每个哈希映射可以容纳一个国家。您是否试图初始化此值:
private HashMap byCountry=new HashMap()
在我上面粘贴的代码中?一组哈希图-有多奇怪问题是什么?一个初学者在做类似
clientsBM.get(I).setGroups(groups);
的事情时遇到的一个陷阱是你现在正在共享
groups
持有的对象。之后对
groups
的任何更改都将适用于所有
clientsBM.get(I)
。老实说,我没有试图理解代码,因为它看起来太复杂了。“我首先创建(预设)HashMap中的所有“标签/键”,因为当我尝试在空的HashMap上迭代时,总是会出现空指针错误”。使用键集中的迭代器以避免命中null。您到底想实现什么?
HashMap[]byCountry
创建一个哈希映射数组,每个哈希映射都可以容纳1个国家。是否尝试初始化此值:
private HashMap byCountry=new HashMap()
在我上面粘贴的代码中?一组哈希图-有多奇怪问题是什么?一个初学者在做类似
clientsBM.get(I).setGroups(groups);
的事情时遇到的一个陷阱是你现在正在共享
groups
持有的对象。之后对
groups
的任何更改都将适用于所有
clientsBM.get(I)
。老实说,我没有试图理解代码,因为它似乎过于复杂。“我首先在HashMap中创建(预设)所有的“标签/键”,因为当我尝试在空的hash map上迭代时,总是会出现空指针错误”。请使用键集中的迭代器避免命中空指针。”。