[英]HashMap using Object as key
我几天前发表了一篇关于在一个简单的银行程序中使用HashMap的文章,但是我在使用对象作为键时遇到了问题。
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的设置没有错误。
此外,还有更好的方法吗?
这会给你更好的主意。 这就是为什么您需要覆盖哈希码和equals方法的原因。
为什么需要重写Java中的equals和hashCode方法?
覆盖哈希码和equals方法之后。
您需要在从hashMap获取数据时使用对象。
HM.get(new Account(2193,"Uri"));
首先,此代码无法编译,因为您要将2个参数传递给get()
,而该参数只需要1个参数。
该参数应该是您在map
使用的key
,并且必须与声明地图时声明的类型相同,在这种情况下, HashMap <Account,Client> HM
表示HM
(按惯例,顺便说一下,小写)将Account
类型的对象和Client
类型的对象作为值作为键。
如果您这样做,它仍然可以编译:
get(2193)
由于get()
需要一个Object
但它只会返回null
。
您需要执行get(new Account(2193,"Uri"))
。
接下来,您无需在这些类中覆盖equals
和hashCode
,但强烈建议您这样做(其他人已经指出了原因)。 另外,根据文档,您应该使键不变,这样它们就不会更改,否则您可能会得到奇怪的行为。
注意:如果将可变对象用作地图键,则必须格外小心。 如果在对象是映射中的键的情况下,以影响等值比较的方式更改对象的值,则不会指定映射的行为。 此禁止的一种特殊情况是,不允许地图包含自身作为键。 虽然允许映射包含自身作为值,但建议格外小心:在此类映射上不再很好地定义equals和hashCode方法。
有关Map
接口的更多详细说明,请遵循Oracle的教程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.