zoukankan      html  css  js  c++  java
  • 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 (美团先关人员写的, 这个还可以)

  • 相关阅读:
    CF666E. Forensic Examination
    bzoj1396 识别子串
    bzoj2839 集合计数
    unknown
    Hibernate中一级缓存和二级缓存
    亲, 我们来再重申一遍"=="和"equals的区别
    BigDecimal类
    序列化详解
    利用简单的参数传递来实现单条查询的easyui-datagrid
    Oracl 动态执行表不可访问,本会话的自动统计被禁止
  • 原文地址:https://www.cnblogs.com/helloqiufei/p/12154862.html
Copyright © 2011-2022 走看看