栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

map的两种遍历方式、hashMap的底层原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

map的两种遍历方式、hashMap的底层原理

Map

储存键值对,保证键值的唯一性是通过HashMap中hash表

map集合常用方法

获取方法

通过KeySet方法,获取Map集合中所有的键的集合

通过values方法,获取Map集合中所有的值的集合

  • Map第一种遍历方法
    • 通过KeySet()方法获取所有键的集合
    • 遍历键的集合,获取所有的键,使用增强for循环实现
    • 根据键去找值,通过get(Object key)方法实现
  • Map第二种遍历方法
    • 通过entrySet()方法获取所有键值对的集合
    • 遍历键的集合,获取所有的键值对,使用增强for循环实现
    • 根据键和值去找键值对,通过getKey()方法获取Key;通过getValue()方法获取value
HashMap的底层实现

hashMap的底层实现是哈希表

  • 哈希表底层采用数组+链表实现,即使用链表处理冲突。

  • 同一hash值的链表都存储在一个链表里。

  • 但是当位于一个桶(数组)中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。

  • 而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

  • 简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。

HashMap的put(k,v)实现
  1. 将k,v封装到Node(节点)对象中
  2. 底层会调用k的hashCode()方法得出hash值
  3. 通过哈希算法,将hash值转换为数组的下标,
  4. 如果该下标的位置上没有任何元素,就把这个Node添加到这个位置上。
  5. 如果该下标的位置上有链表,此时,就会将k和链表上的每个节点的k进行比较(使用equals()方法)
  6. 如果equals()方法返回的是false,则把这个新的节点添加到链表的末尾
  7. 如果equals()方法返回的是true,那么这个节点的value就被覆盖
HashMap的get(k)实现
  1. 调用hashCode()方法得出哈希值,通过哈希算法将其转换为数组的下标
  2. 通过上面获取的下标,可以快速定位到该下标的位置
  3. 如果该下标的位置上什么都没有,就返回null
  4. 如果该下标的位置上有单向链表,那么就会拿get(k)方法里面的k,与单向链表上的每一个节点比较(通过equals()方法)
  5. 如果通过4的equals()方法,返回的值是false,则get()方法返回null
  6. 如果通过4的equals()方法,返回的值是true,该节点的value就是需要找的value值,get()方法返回这个value值
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328239.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号