A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小白进阶之路 高级黑马   /  2018-1-5 17:56  /  965 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问: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 中,所以效率高。
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马