HashMap 值在不告诉它们的情况下发生变化

HashMap values are changing without telling them to

我有一个我无法理解的问题..

我正在构建 HashMap called wholeSetHistory

我正在构建一个 HashMap,它具有与 wholeSetHistory 相同的键和值,称为 wholeSetHistoryT

我以类似的方式创建了两个 HashMaps called wholeSetRates, wholeSetRatesT

所有 HashMap 都采用这种格式 HashMap<String, HashMap<String, Double>> .

我有创建火车集的功能

public void createTrainSet(HashMap<String, HashMap<String, Double>> wholeSetRates, HashMap<String, HashMap<String, Double>> wholeSetHistory){
    for(String fbid : wholeSetHistory.keySet()){
        ArrayList<String> locsBe = new ArrayList<>();
        HashMap<String, Double> locss = wholeSetHistory.get(fbid);
        HashMap<String, Double> locss2 = wholeSetRates.get(fbid);
        for(String loc : locss.keySet()){
            if(locss.get(loc)==1.0){
                locsBe.add(loc);
            }
        }
        ArrayList<Integer> randomNums = new ArrayList<>();
        for(int i=0; i<2; i++){
            Random rn = new Random();
            int randomNum; 
            do{
                int range = locsBe.size() - 1 + 1;                    
                randomNum =  rn.nextInt(range); 
            }while(randomNums.contains(randomNum));
            randomNums.add(randomNum); 
            locss.put(locsBe.get(randomNum), 0.0);
            locss2.put(locsBe.get(randomNum), 0.0);
            wholeSetHistory.put(fbid, locss);    
            wholeSetRates.put(fbid, locss2);   
        }
        randomNums.clear();
    }  
}

所以,我以后就是这样用的

(... creation of wholeSetHistory, wholeSetHistoryT, wholeSetRates, wholeSetRatesT)
System.out.println(wholeSetHistory.get("1"));//1
createTrainSet(wholeSetRatings, wholeSetHistory, nearUserIDWithVisitedTrueValues);

这意味着我仅将函数作为参数传递给函数 wholeSetHistory

虽然,后来我

System.out.println(wholeSetHistory.get("1"));//2
System.out.println(wholeSetHistoryT.get("1"));//3

事情是这样的:

The values that changes in wholeSetHistory changes in wholeSetHistoryT too! For example, prints 2 and 3 are the same(!) and different from 1.

感谢任何帮助。

引用指向内存中的某个位置。如果将相同的引用添加到两个不同的数据结构中,更改一个中的引用也会更改另一个。它们指向内存中的同一个对象。