存储在Map中的每个对象返回存储在最后一个对象中的值

时间:2016-10-18 19:56:57

标签: java arraylist hashmap

我在这方面检查了一些解决方案,但他们似乎都说问题是当人们使用"静态"在创建HashMap时使用类名称或者不使用类名。我正在尝试创建一个包含人名(密钥)和测试分数(值)的地图。我试图传递一个对象为值这样做:

HashMap<String, Scores> map = new HashMap<String, Scores>();

List<Integer> scores = new ArrayList<Integer>();
scores.add(55);
scores.add(66);
scores.add(77);

map.put("foo", new Scores(scores));

scores.clear();

scores.add(70);
scores.add(80);
scores.add(90);

map.put("bar", new Scores(scores));

System.out.println(map.get("foo").getScores());
System.out.println(map.get("bar").getScores());
System.out.println(map.get("foo").getAverage());

对于我的分数课程,我有以下内容:

List<Integer> scores = new ArrayList<Integer>();
private int sum = 0;

public Scores(List<Integer> s){
    this.scores = s;
}

public double getAverage(){
    int count = 0;
    for (int x: this.scores){
        this.sum += x;
        count++;
    }
    return this.sum / count;
}

public List<Integer> getScores(){
    return this.scores;
}

当我运行我的代码时,我得到以下输出:

[70, 80, 90]
[70, 80, 90]
80.0

我没有使用&#34;静态&#34;存储我的分数,之后使用clear()来保持旧值不再重复。我在创建HashMap时也使用了类名&lt;&gt;变量

任何人都可以告诉我为什么两个&#39; map.get(&#34; foo&#34;)&#39;和&#39; map.get(&#34; bar&#34;)&#39;返回相同的值以及如何解决这个问题?他们还能提供一个有效的例子吗?谢谢!

2 个答案:

答案 0 :(得分:3)

new Scores(scores)没有创建传递给它的List实例的副本。它存储对List的引用。

因此,您在Scores中作为值引用的Map个实例都引用相同的List

而不是

scores.clear();

您应该创建一个新的List

scores = new ArrayList<Integer>();

以便两个Scores个实例引用不同的List s。

答案 1 :(得分:0)

基元(byte,short,int,long,float,double,boolean,char等)和引用类型(任何可实例化的类以及数组。字符串,Scanner,Random,Die,int [],String []等)有不同的行为。

您需要实际实例化一个新的ArrayList - 如下所示:

scores = new ArrayList<Integer>();

创建新列表。在您的代码中,您只是将引用传递给同一列表。