HashMap 详细讲解

                                                                                    ---------------------------  剩下的时间不多了,抓紧做自己的事情

1、HashMap 的实质

   Hashmap =   数组   +   链表  +   红黑树 (jdk 1.8)

白话说: hashmap 是一个数组, 但是这个数组是一个链表的数组,即数组中的每一个元素存储的是个链表。

 

 

2、 HashMap Put 存数据

    (1) 当一个键值对存入的时候,先判断它应该在数组的哪个位置?

        答: hashMap 是通过 对键值 进行hashcode, 取模,高位取值(这一些操作,可以自己去查查), 获取这个键值对应该存储的位置

    (2)数组中的每一个元素都是 链表, 那么键值对是如何插入的? 

        答: 先遍历链表看有没有和相同的键值对,相同的就不需要进行数据存储

                如何不同,则进行插入链表的头部。

    (3)上面存储中存在一些问题!

              数组中某一个链表过长后, 在查询过程的效率一定的较低的, 怎么处理的?

         答: 在java 1.8  里面,引入的红黑树, 链表的长度大于8 的时候, 会将链表转化为 红黑树,利用红黑树

                 的查询速快的优点, 提高后期查询的速度

 

 

3、 如何进行扩容

 

 

 

 

4、 Hashmap的缺点

  hashMap 存放读取出的数据和存放数据的顺序是不一致的, 因为在存取的时候是按照键值K 的hashcode 进行存储的

所以在数组的位置不是按照顺序进行排序的。

       但是你在遍历的时候, 获取的键的set 肯定是按照数组的顺序给你生成的, 所以无法按照原来的存入的顺序输出元素,

这个也不能是缺点,只能说是hashMap 的特质。

     相对于hashmap的无法顺序读, linkedHashmap 可以解决这个问题, 因为它的内部存储是基于链表,进行存储的。

 

(个人感悟: 你自己看源码就会,发现这些问题,它本身的实现造成了它一定存在某种问题)

 

5、 大佬的相关文件

      https://tech.meituan.com/2016/06/24/java-hashmap.html (美团先关人员写的, 这个还可以)

posted on 2020-01-06 09:45  黄山一叶  阅读(299)  评论(0编辑  收藏  举报