我几天前发了一篇关于在一个简单的银行程序中使用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的设置没有错误。
此外,还有更好的方法吗?
答案 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