0

我正在添加/编辑作为哈希图中值的对象——具有不同的键。

但是,在 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
4

3 回答 3

5

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

尝试将您的类更改为具有实例数据(即只需删除静态 on private int value)。

于 2013-04-02T07:43:37.033 回答
2

这是因为value在您的班级exObj中是static

public class exObj {

private static int value;

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

请参阅了解实例和类成员

于 2013-04-02T07:45:40.100 回答
0

正如@Jeff Foster 和@Jesper 所说,这完全是关于使用静态变量。只是为了在您的示例中添加更多信息,通过运行代码

for (int i = 0; i<10; i++){
    hm.put(i, new exObj(i));
}

最后一个被初始化的 exObj 获得值 '9',它为所有实例共享。然后通过调用

hm.get(2).setValue();

该值设置为“10”

您可以简单地将“价值”声明为

private int value;

所以 exObj 的每个实例都会有它自己的价值。还记得让你的班级名称以大写字母开头,作为一个好习惯

于 2013-04-02T08:36:42.323 回答