`

java集合中Map的hashCode()和equals()方法重要性

阅读更多
1.HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。
  当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则:
// 1.
if(o1.equals(o2))
  return o1.hashCode() == o2.hashCode();//总是为true的。
//2.
if(o1.hashCode() == o2.hashCode())
  return o1.equals(o2)// 不意味着总会为true。


2.Map接口提供三个集合视图:
  (1)Set keyset():返回map中包含的所有key的一个Set视图。
  (2)Collection values():返回一个map中包含的所有value的一个Collection视图。
  (3)Set<Map.Entry<K,V>> entrySet():返回一个map钟包含的所有映射的一个集合视图。

3.HashMap和HashTable有何不同?
(1)HashMap允许key和value为null,而HashTable不允许。
(2)HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。
(3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。
(4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。
(5)HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics