存储新对象作为hashmap的值?

时间:2012-08-23 20:55:12

标签: java hashmap

我试图找到一种方法来存储类的新实例作为Java hashmap中的值。这个想法是由Java讲师给我的,以便创建一个可用于我正在处理的程序的数据存储结构。

他向我推荐的想法是使用存储计算机名称的hashmap作为键,值将是InfoStor.class类的新实例。 InfoStor包含getName(),setName(),getMemory()等方法。

我有基本测试的类和方法,以确定它是否可行。我遇到的问题是,一旦我在hashmap中创建了一个新条目,我就无法弄清楚如何使用InfoStor中的方法。

这是我到目前为止的代码;

VMware.class

import java.util.HashMap;

public class VMware {

    public static void main(String[] args) {                       
        HashMap <String, Object> mapper = new HashMap();            
        mapper.put("NS01", new InfoStor("NS01"));            
        //mapper.get("NS01").            
    }            
}

InfoStor.class

public class InfoStor {

    private String vmName;
    private String platform;
    private Integer memory;

    public InfoStor (String name) {
        vmName = name;
    }

    String getName(){
        return vmName;
    }

    void setPlatform(String p){
        platform = p;
    }

    String getPlatform(){
        return platform;
    }

    void setMemory(Integer m){
        memory = m;
    }

    Integer getMemory(){
        return memory;
    }
}

我想要完成的是这样的(基本想法)。

Object var = mapper.get("NS01");    
System.out.println(var.getMemory());

我是以错误的方式来做这件事的吗?感谢任何帮助。

5 个答案:

答案 0 :(得分:15)

问题是您的代码仅指定地图中的值为Object。你知道的不止这些,所以告诉编译器这些信息:

HashMap<String, InfoStor> mapper = new HashMap<String, InfoStor>();
mapper.put("NS01", new InfoStor("NS01"));
...

InfoStor value = mapper.get("NS01");
Integer memory = value.getMemory();

请注意,它通常 虽然并不总是更好地使用接口作为变量类型 - 并且您可以使用菱形运算符进行构造函数调用,让编译器使用类型推断来填充类型参数:

Map<String, InfoStor> mapper = new HashMap<>();
mapper.put("NS01", new InfoStor("NS01"));
...

InfoStor value = mapper.get("NS01");
Integer memory = value.getMemory();

答案 1 :(得分:9)

如果你这样声明你的hashmap:

HashMap<String, InfoStor> mapper = new HashMap<String, InfoStor>();

然后当你从映射器中获取一个对象时,它将是InfoStor的一个实例(你不需要抛出它或者担心类转换异常,因为它不是rist类。)< / p>

所以:

InfoStor myStor = mapper.get("somekey");
myStor.getMemory(); // this will work

否则,如果您坚持使用原始代码中使用的HashMap<String, Object>,则需要在调用方法之前进行强制转换:

Object obj = mapper.get("somekey");
((InfoStor)obj).getMemory(); // cast is required
obj.getMemory(); // this will not compile

您应该阅读Java泛型。

答案 2 :(得分:1)

利用添加到java的泛型。它们有助于编译时类型检查,并且它们使得转换不必要。

  HashMap <String, Object> mapper = new HashMap();
  //you will be able to retrieve an object and then cast it to your InfoStore
  InforStore isN01 = (InfoStore)mapper.get("N01");

  //this will unfortunately be accepted, even thought it's a bug
  mapper.put("N02", new Integer(0));

  ________________________

  HashMap <String, InfoStore> mapper = new HashMap();
  //you will be able to retrieve an object and then cast it to your InfoStore
  InforStore isN01 = mapper.get("N01"); //no cast

答案 3 :(得分:0)

你走在正确的轨道上......

将地图初始化为:

HashMap <String, InfoStor> mapper = new HashMap<String, InfoStor>();

然后在向地图添加对象后,使用以下命令检索它们:

InfoStor var = mapper.get("NS01");
System.out.println(var.getMemory());

答案 4 :(得分:-1)

你可以通过使用数组来烹饪...例如,如果你可以在数组中存储对象然后使用这个想法在哈希映射中实现它...我不知道你如何设计但我曾经卡在那里并制作通过这样的

...示例

班级公主{

int age;

public princess(int age){
    this.age=age;
}
public int getAge(){
    return this.age;
}

}

public class hashmaptest {

public static void main(String[] args) {
  princess[] p=new princess[10];
  HashMap scores = new HashMap();
  scores.put("a",new princess(6));
  scores.put("b",new princess(7));

  p[0]=(princess)scores.get("a");
   System.out.println(p[0].getAge());
  p[0]=null;
   p[0]=(princess)scores.get("b");

  System.out.println(p[0].getAge());



}

}