HashMap数组结构与链表结构的实现例子
2018-01-14 13:45
218 查看
以下内容属于笔记,如有人阅读并发现错误,请不吝指出。
首先先了解下HashMap的实现原理,HashMap使用数组和链表的形式存储数据,这是HashMap的牛X所在。一开始,我只看到HashMap中时Entry[]的形式存储数据,很久以后,但我看到next关键字后才意识到,Entry是个链表结构。
如下代码:
HashMap的put方法截图①
HashMap的添加元素Entry方法截图②
我们知道,当你使用put方法将键值对放入HashMap中时,首先会对key值去hash值确定Entry数组中的位置,如果这个位置上已经有元素存在,就会去遍历该位置上的Entry链表对象,替换或者赋值给Entry。
比如,依次加入如下三个元素:(Aa与BBhashcode值相同)
HashMap添加元素
最后的结果是Entry数组中元素为
添加结果
BB=2222的next指向Aa=2222,Aa=1111被最后一次Aa=2222给更新了
HashMap链表结构图截
具体的过程如下:
第一次放入Aa=1111,在Entry数组下标下标为4的地方放入,之后在放入BB=2222时,由于Aa与BB的hashcode相同,得到Entry数组下标也为4,就会在该位置插入BB=2222,并将BB=2222的next指向Aa=1111(执行②中BB的next指向Aa),最后再放入Aa=2222,又是数组下标为4,取该位置的Entry链表,取next,发现为Aa=1111,于是将Aa=1111更新为2222(执行①中for循环进行更新).
[align=center]
[/align]
首先先了解下HashMap的实现原理,HashMap使用数组和链表的形式存储数据,这是HashMap的牛X所在。一开始,我只看到HashMap中时Entry[]的形式存储数据,很久以后,但我看到next关键字后才意识到,Entry是个链表结构。
如下代码:
HashMap的put方法截图①
HashMap的添加元素Entry方法截图②
我们知道,当你使用put方法将键值对放入HashMap中时,首先会对key值去hash值确定Entry数组中的位置,如果这个位置上已经有元素存在,就会去遍历该位置上的Entry链表对象,替换或者赋值给Entry。
比如,依次加入如下三个元素:(Aa与BBhashcode值相同)
HashMap添加元素
最后的结果是Entry数组中元素为
添加结果
BB=2222的next指向Aa=2222,Aa=1111被最后一次Aa=2222给更新了
HashMap链表结构图截
具体的过程如下:
第一次放入Aa=1111,在Entry数组下标下标为4的地方放入,之后在放入BB=2222时,由于Aa与BB的hashcode相同,得到Entry数组下标也为4,就会在该位置插入BB=2222,并将BB=2222的next指向Aa=1111(执行②中BB的next指向Aa),最后再放入Aa=2222,又是数组下标为4,取该位置的Entry链表,取next,发现为Aa=1111,于是将Aa=1111更新为2222(执行①中for循环进行更新).
[align=center]
[/align]
相关文章推荐
- 数据结构之用数组和链表实现队列
- Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树)
- 数据结构之stack,queue的数组与链表实现
- 每日一省之————利用数组和链表实现一个简单的HashMap
- jdk1.8 HashMap 实现 数组+链表/红黑树(默认桶中长度大于8时)
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 数据结构再学习--数组实现链表
- 数据结构与实现——数组、矩阵、链表、队列、栈、对象、二叉树和红黑树
- 自行实现Map底层结构(数组+链表) --Java版
- HashMap实现原理,利用数组和链表存储元素
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- 数据结构之顺序表(数组实现与链表实现)
- 107-109_容器_自己实现HashMap_Map底层实现_哈希算法实现_使用数组和链表
- 学会一种数据结构二:队列的数组实现和链表实现
- C 数据结构使用数组和链表实现栈
- 数据结构之用数组和链表实现栈
- 用数组和链表实现栈结构
- HashMap集合源码以及底层结构解析(何时数组+单项链表变为数组+红黑二叉树)