我正在使用不同的键添加/编辑hashmap中值的对象。
但是,编辑hashmap中的一个对象似乎全部编辑它们(?)
我在这里做错了什么?
首先,我的(命名不佳的)hashmap类:
import java.util.HashMap;
public class hashmap {
static HashMap<Integer, exObj> hm;
hashmap(){
hm = new HashMap<Integer, exObj>();
}
public void createVal(){
for (int i = 0; i<10; i++){
hm.put(i, new exObj(i));
}
hm.get(2).setValue();
}
public void printVal(){
for (int i = 0; i<10; i++){
System.out.println(hm.get(i).getValue());
}
}
public static void main(String args[]){
hashmap hmap = new hashmap();
hmap.createVal();
hmap.printVal();
}
}
其次,我的简单exObj类:
public class exObj {
private static int value;
exObj(int i){
value = i;
}
public void setValue(){
value = value + 1;
}
public int getValue(){
return value;
}
}
返回输出:
10
10
10
10
10
10
10
10
10
10
答案 0 :(得分:5)
您拥有在类的所有实例之间共享的静态数据。
尝试更改您的课程以获取实例数据(即只需删除private int value
上的静态数据。)
答案 1 :(得分:2)
这是因为您的班级value
中的exObj
为static
:
public class exObj {
private static int value;
因为它是static
,所以只有一个变量副本,由所有exObj
个对象共享。
答案 2 :(得分:0)
正如@Jeff Foster和@Jesper所说,这都是关于使用静态变量的。只需通过运行代码
为您的示例添加更多信息for (int i = 0; i<10; i++){
hm.put(i, new exObj(i));
}
初始化的最后一个exObj获取值&#39; 9&#39;,这是为所有实例共享的。然后通过调用
hm.get(2).setValue();
该值设置为&#39; 10&#39;
您只需声明&#39;值&#39;如
private int value;
因此exObj的每个实例都拥有它自己的价值。还记得让你的班级名字以大写字母开头,这是一种很好的做法