HashMap值正在改变,而没有告诉他们

时间:2016-05-20 23:21:31

标签: java hashmap training-data

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

我正在构建HashMap called wholeSetHistory

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

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

所有HashMaps都采用此格式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

这就是:

  

wholeSetHistory中更改的值也会在wholeSetHistoryT中更改!   例如,印刷品2和3是相同的(!),与1不同。

任何帮助都是mych赞赏的。

1 个答案:

答案 0 :(得分:3)

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