Java:HashMap中的对象作为值被覆盖?

时间:2013-04-02 07:42:30

标签: java hashmap overwrite

我正在使用不同的键添加/编辑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

3 个答案:

答案 0 :(得分:5)

您拥有在类的所有实例之间共享的静态数据。

尝试更改您的课程以获取实例数据(即只需删除private int value上的静态数据。)

答案 1 :(得分:2)

这是因为您的班级value中的exObjstatic

public class exObj {

private static int value;

因为它是static,所以只有一个变量副本,由所有exObj个对象共享。

请参阅Understanding Instance and Class Members

答案 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的每个实例都拥有它自己的价值。还记得让你的班级名字以大写字母开头,这是一种很好的做法