问:HashMap 中的 key 如果是 Object 则需要实现哪些方法?
答:hashCode 方法和 equals 方法。
因为 hashCode 方法用来计算 Entry 在数组中的 index 索引位置,equals 方法用来比较数组指定 index 索引位置上链表的节点 Entry 元素是否相等。否则由于 hashCode 方法实现不恰当会导致严重的 hash 碰撞,从而使 HashMap 会退化成链表结构而影响性能。关于这个问题还可以查看历史推送文章【码农每日一题】Java equals 与 hashCode 相关面试题 了解更多。
问:下面两种遍历方式有什么区别?为什么?
//第一种
Map
map
=
new
HashMap
();
Iterator
iter
=
map
.
entrySet
().
iterator
();
while
(
iter
.
hasNext
())
{
Map
.
Entry
entry
=
(
Map
.
Entry
)
iter
.
next
();
Object
key
=
entry
.
getKey
();
Object
val
=
entry
.
getValue
();
}
//第二种
Map
map
=
new
HashMap
();
Iterator
iter
=
map
.
keySet
().
iterator
();
while
(
iter
.
hasNext
())
{
Object
key
=
iter
.
next
();
Object
val
=
map
.
get
(
key
);
}
答:第一种方式效率高且推荐用。
因为 HashMap 的这两种遍历是分别对 keySet 和 entrySet 进行迭代,对于 keySet 实质上是遍历了两次,一次是转为 iterator 迭代器遍历,一次就从 HashMap 中取出 key 所对于的 value 操作(通过 key 值 hashCode 和 equals 索引);而 entrySet 方式只遍历了一次,它把 key 和 value 都放到了 Entry 中,所以效率高。
|