JDK1.7中HashMap的常用方法实现原理
2018-03-27 18:02
381 查看
HashMap中的数据结构是数组+单链表的组合,以键值对(key-value)的形式存储元素的,通过put()和get()方法储存和获取对象。
(方块表示Entry对象,横排表示数组table[],纵排表示哈希桶bucket【实际上是一个由Entry组成的链表,新加入的Entry放在链头,最先加入的放在链尾】)
put():传递键和值时,HashMap会由key来调用hash()方法,返回键的hash值,计算Index后用于找到bucket(哈希桶)的位置来储存Entry对象。 如果两个对象key的hash值相同,那么它们的bucket位置也相同,但equals()不相同,添加元素时会发生hash碰撞,也叫hash冲突,HashMap使用链表来解决碰撞问题。(1)在put()时,HashMap会先遍历table数组,用hash值和equals()判断数组中是否存在完全相同的key对象, 如果这个key对象在table数组中已经存在,就用新的value代替老的value。如果不存在,就创建一个新的Entry对象添加到table[ i ]处。(2)如果该table[ i ]已经存在其他元素,那么新Entry对象将会储存在bucket链表的表头,通过next指向原有的Entry对象,形成链表结构。如下图:put()方法的执行过程:
get():如果两个不同的key的hashcode相同,两个值对象储存在同一个bucket位置,要获取value,我们调用get()方法,HashMap会使用key的hashcode找到bucket位置,因为HashMap在链表中存储的是Entry键值对,所以找到bucket位置之后,会调用key的equals()方法,按顺序遍历链表的每个 Entry,直到找到想获取的 Entry 为止——如果恰好要搜索的 Entry 位于该 Entry 链的最末端(该 Entry 是最早放入该 bucket 中),那HashMap必须循环到最后才能找到该元素。
(方块表示Entry对象,横排表示数组table[],纵排表示哈希桶bucket【实际上是一个由Entry组成的链表,新加入的Entry放在链头,最先加入的放在链尾】)
put():传递键和值时,HashMap会由key来调用hash()方法,返回键的hash值,计算Index后用于找到bucket(哈希桶)的位置来储存Entry对象。 如果两个对象key的hash值相同,那么它们的bucket位置也相同,但equals()不相同,添加元素时会发生hash碰撞,也叫hash冲突,HashMap使用链表来解决碰撞问题。(1)在put()时,HashMap会先遍历table数组,用hash值和equals()判断数组中是否存在完全相同的key对象, 如果这个key对象在table数组中已经存在,就用新的value代替老的value。如果不存在,就创建一个新的Entry对象添加到table[ i ]处。(2)如果该table[ i ]已经存在其他元素,那么新Entry对象将会储存在bucket链表的表头,通过next指向原有的Entry对象,形成链表结构。如下图:put()方法的执行过程:
相关文章推荐
- iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解
- java双缓冲原理和实现 消除闪烁的常用方法
- HashMap的原理分析(2)get和remove方法的实现
- 一起谈.NET技术,【经验总结】C#常用线程同步方法应用场景和实现原理
- jdk7中hashmap实现原理和jdk8中hashmap的改进方法总结
- HashMap的实现原理及hash冲突解决方法
- JDK源码之解读hashMap 的put和get方法的实现原理
- Taglib原理和实现 第六章:标签内常用方法总结
- Java - 线程安全的 HashMap 实现方法及原理
- HashMap的put和get方法实现原理
- jdk7中hashmap实现原理和jdk8中hashmap的改进方法总结
- iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解
- String 类的常用方法及其大概实现原理
- HashMap的原理分析(1)put方法的实现
- 常用的相似度计算方法原理及实现
- JDK源码之解读hashMap 的put和get方法的实现原理
- 【经验总结】C#常用线程同“.NET研究”步方法应用场景和实现原理
- HashMap中实现原理及hashcode方法
- 【经验总结】C#常用线程同步方法应用场景和实现原理
- 常用的几种交互表存储过程的实现方法