我在这方面检查了一些解决方案,但他们似乎都说问题是当人们使用"静态"在创建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;返回相同的值以及如何解决这个问题?他们还能提供一个有效的例子吗?谢谢!
答案 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>();
创建新列表。在您的代码中,您只是将引用传递给同一列表。