Java Hashmap替换值

Java Hashmap替换值,java,Java,我不知道hashmap内容是如何变化的 下面是我的代码: public static void main(String args[]){ HashMap<String, Double> map= new HashMap<>(); map.put("com.x",30.00d); map.put("com.y",70.00d); map.put("com.z",70.00d); List<String> readySe

我不知道hashmap内容是如何变化的

下面是我的代码:

public static void main(String args[]){

    HashMap<String, Double> map= new HashMap<>();
    map.put("com.x",30.00d);
    map.put("com.y",70.00d);
    map.put("com.z",70.00d);

    List<String> readyServers=new ArrayList<>();
    readyServers.add("system-01");
    readyServers.add("system-02");

    returnServerMapping(2,170.00d,map,readyServers);
}



private static void returnServerMapping(int serverRequired, double totalExpectedExecutionTime,
                                                                   HashMap<String, Double> map, List<String> readyServers) {
    Map<String,List<String>> testSuiteAndServerMap= new HashMap<>();
    List<String> suitesForServer = new ArrayList<>();

    Double executionTimePerServer = totalExpectedExecutionTime / serverRequired;

    int currentServerNumber = 1;
    Double currentTime = 0.0d;
    for (Map.Entry<String, Double> entry : map.entrySet()) {
        Double t = entry.getValue();

        System.out.println(currentServerNumber + " of " + serverRequired + ": " + entry.getKey());
        suitesForServer.add(entry.getKey());
        System.out.println("1.suites:"+suitesForServer);

        currentTime += t;

        if(currentServerNumber == serverRequired){// In the last case, let's get the all remaining suites & finally map this list with the last server
        }else if(currentTime >= executionTimePerServer && currentServerNumber < serverRequired){
            System.out.println("Putting data into the map : server:"+readyServers.get(currentServerNumber-1)+"="+suitesForServer);
            System.out.println("2.suites:"+suitesForServer);
            testSuiteAndServerMap.put(readyServers.get(currentServerNumber-1), suitesForServer);
            suitesForServer.removeAll(suitesForServer);
            System.out.println("3.suites:"+suitesForServer);
            currentServerNumber++;currentTime = 0.0d;
        }
    }
    System.out.println("4.suites:"+suitesForServer);
    testSuiteAndServerMap.put(readyServers.get(serverRequired-1), suitesForServer);
    System.out.println("Final servers & suites:"+testSuiteAndServerMap);
}
所以问题是当system-01=[com.z,com.y]时,它为什么会在最后设置为system-01=[com.x]

编辑:调试后,我找到了hashmap内容 在suitesForServer.removeAll之前(suitesForServer);=>key-system-01&值0-com.z,值1-com.y

在suitesForServer.removeAll之后(suitesForServer);=>key-system-01&值大小=0

已解决:HashMap正在引用列表。一旦列表内容发生更改(在任何位置),hashmap也会修改内容。为了解决这个问题,我使用了一个只复制列表内容的浅拷贝

List<String> suites= new ArrayList<>(suitesForServer);
                testSuiteAndServerMap.put(readyServers.get(currentServerNumber-1), suites); 
List suites=new ArrayList(suitesForServer);
testSuiteAndServerMap.put(readyServer.get(currentServerNumber-1),suites);

地图的值始终与列表实例相同。 将列表放入
else
中的地图后,您可以通过
suitesForServer.removeAll(suitesForServer)
清除地图。 我建议在您的
if
中,将
com.x
添加到列表中

List<String> suites= new ArrayList<>(suitesForServer);
                testSuiteAndServerMap.put(readyServers.get(currentServerNumber-1), suites); 
在每次迭代中,您应该创建一个新的
列表
实例:

for (Map.Entry<String, Double> entry : map.entrySet()) {
    List<String> suitesForServer = new ArrayList<>();
    ...
for(Map.Entry:Map.entrySet()){
List suitesForServer=new ArrayList();
...

调试您的程序。然后您可以一步一步地看到发生了什么。简化代码并保留您认为存在问题的唯一部分。我相信您的问题可能在于:
currentServerNumber-1
我可能是错的,因为我没有测试它,但从一眼看,它似乎是罪魁祸首
,否则如果(currentTime>=executionTimePerServer&¤tServerNumber
在这里,您不应该将
=
用于
数据类型。请使用
(a>b | | a-b>1e-8)
formatHint:您认为您正在创建多少个
ArrayList
实例?请记住,映射中的的值将是对对象的引用…您正在一次又一次地使用相同的值。谢谢!即使我在循环内初始化它,在循环后我也希望保留内容。相反,我使用了List suites=new ArrayList(suitesForServer);内部在else循环中。这有助于hashmap不引用在顶部初始化的任何对象。