HashMap使用Object作为键

时间:2015-04-03 04:23:55

标签: java hashmap

我几天前发了一篇关于在一个简单的银行程序中使用HashMap的帖子,但是我在使用Objects作为键时遇到了问题。

    HashMap <Account,Client> HM = new HashMap<Account, Client>();
    HM.put(new Account(2193,"Uri"), new Client(2193,0,"Uri"));
    HM.get(2193,"Uri");

帐户和客户端是源的其他部分中的类。我的问题是HM.get没有按预期工作,并且给了我一个错误。还有另一种方法我要'获得'价值吗?不确定如何使用密钥。请注意,HashMap的设置没有错误。

此外,还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

这会给你更好的主意。这就是为什么你需要覆盖hashcode和equals方法。

Why do I need to override the equals and hashCode methods in Java?

重写hashcode和equals方法之后。

您需要在从hashMap获取数据时使用您的对象。

HM.get(new Account(2193,"Uri"));

答案 1 :(得分:1)

首先,这个代码没有编译,因为你将2个参数传递给get(),它只需要1个参数。

该论点应该是您在key中使用的map,并且必须与您声明地图时声明的类型相同,在您的情况下HashMap <Account,Client> HM表示{ {1}}(按惯例,btw应该小写)作为HM类型的键对象和类型为Account的对象作为值。

如果你这样做,它仍会编译:

Client

由于get(2193) 需要get(),但它只会返回Object

您需要null

接下来,您不需要在这些类中覆盖get(new Account(2193,"Uri"))equals,但建议高度(其他人已经指出链接说明原因)。另外,根据doc,您应该使密钥不可变,因此它们不会更改,否则您可能会遇到奇怪的行为。

  

注意:如果将可变对象用作地图,则必须非常小心   键。如果对象的值,则不指定映射的行为   以一种影响等于比较的方式改变   对象是地图中的关键。这一禁令的一个特例是   地图不允许将自己包含为关键字。虽然它   允许地图将自己包含为一个值,极其谨慎   建议:equals和hashCode方法不再明确定义   在这样的地图上。

有关hashCode界面的详细说明,请点击Oracle's tutorial