在HashMap中获取错误的值

时间:2016-10-02 16:22:48

标签: java oop object hashmap

我创建了HashMap来存储Brand:Car key value对并​​插入了两个汽车品牌及其详细信息。但是在调用.get(key)方法时,我获取了最后存储的值。

public class MapTest {
public static void main(String args[]) {

    MapTest map=new MapTest();
    map.test();

}
public void test() {
    HashMap<String,Car> vehicle=new HashMap<>();
    Details def=new Details();
    Car car=new Car();
    car.name="Mustang";
    def.model="SportsRoof";
    def.model_no=1969;
    def.color="Blue";
    car.features.add(def);
    vehicle.put("Ford",car);
    car.name="R8";
    def.model="Coupe";
    def.model_no=2009;
    def.color="Black";
    car.features.clear();
    car.features.add(def);
    vehicle.put("Audi",car);
    System.out.println(vehicle.get("Ford").name);
    System.out.println(vehicle.get("Ford").features.get(0).model);
    System.out.println(vehicle.get("Ford").features.get(0).model_no);
    System.out.println(vehicle.get("Ford").features.get(0).color);
}

其他Clsses

public class Car {
    String name;
    List<Details> features=new ArrayList<>();
    public Car() {

    }
}
public class Details {
    String model;
    int model_no;
    String color;
    public Details() {

    }
}
}

输出 R8 双门跑车 2009年 黑

2 个答案:

答案 0 :(得分:0)

你一遍又一遍地重复使用同一辆车。所以,你真的没有在hashmap中插入不同的汽车,你正在插入相同的汽车对象。但是,一个意想不到的副作用是当你改变时,例如汽车的名称,你在地图中到处更改它。

所以,你的代码应该是这样的:

HashMap<String,Car> vehicle = new HashMap<>();
Details def= new Details();
Car car = new Car();
car.name = "Mustang";
def.model = "SportsRoof";
def.model_no = 1969;
def.color = "Blue";
car.features.add(def);
vehicle.put("Ford",car);
// create a new Car object
car = new Car();
car.name = "R8";
def.model = "Coupe";
def.model_no = 2009;
def.color = "Black";
car.features.clear();
car.features.add(def);
vehicle.put("Audi",car);

答案 1 :(得分:0)

Java对象中存储基于references的对象。您正在初始化汽车变量one time并将其分配给Map的所有密钥。

您需要为Car中的不同keys创建不同的Map个实例。而且您还需要创建类Details的不同实例。