参考解答
我们可以使用任何类作为Map的key,然而在使用它们之前,需要考虑以下几点:
(1)如果类重写了equals()方法,它也应该重写hashCode()方法。
(2)类的所有实例需要遵循与equals()和hashCode()相关的规则。请参考之前提到的这些规则。
(3)如果一个类没有使用equals(),你不应该在hashCode()中使用它。
(4)用户自定义key类的最佳实践是使之为不可变的,这样,hashCode()值可以被缓存起来,拥有更好的性能。不可变的类也可以确保hashCode()和equals()在未来不会改变,这样就会解决与可变相关的问题了。
比如,我有一个类MyKey,在HashMap中使用它。
1 2 3 4 5 6 7 | //传递给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大量使用。
相似问题
BlockingQueue是什么?
BlockingQueue是什么?
集合框架里实现的通用算法有哪些?
集合框架里实现的通用算法有哪些?
迭代器fail-fast属性有什么意义?
迭代器fail-fast属性有什么意义?
ArrayList和Vector有何异同点?
ArrayList和Vector有何异同点?
为何迭代器没有一个方法可以直接获取下一个元素 而不需要移动游标?
为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标?
