我们可以使用任何类作为 Map 的 key ,然而在使用它们之前,需要考虑以下几点:
(
1 )如果类重写了 equals() 方法,它也应该重写 hashCode() 方法。
(
2 )类的所有实例需要遵循与 equals() 和 hashCode() 相关的规则。请参考之前提到的这些规则。
(
3 )如果一个类没有使用 equals() ,你不应该在 hashCode() 中使用它。
(
4 )用户自定义 key 类的最佳实践是使之为不可变的,这样, hashCode() 值可以被缓存起来,拥有更好
的性能。不可变的类也可以确保 hashCode() 和 equals() 在未来不会改变,这样就会解决与可变相关的问
题了。
比如,我有一个类 MyKey ,在 HashMap 中使用它。
// 传递给 MyKey 的 name 参数被用于 equals() 和 hashCode() 中 MyKey key = new MyKey('Pankaj');
//assume hashCode=1234 myHashMap.put(key, 'Value'); // 以下的代码会改变 key 的 hashCode() 和
equals() 值 key.setName('Amit'); //assume new hashCode=7890 // 下面会返回 null ,因为 HashMap 会
尝试查找存储同样索引的 key ,而 key 已被改变了,匹配失败,返回 null myHashMap.get(new
MyKey('Pankaj')); 那就是为何 String 和 Integer 被作为 HashMap 的 key 大量使用。