| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 深入理解java HashMap -> 正文阅读 |
|
[数据结构与算法]深入理解java HashMap |
深入理解java HashMap前言:? 在java 中我们经常会使用到map放法,其中最常用的莫过于hashmap,hashmap 的重要性不言而喻无论实战还是面试还是提高都必须牢牢掌握的。下面我们以java1.8为例.想真正的去了解hashmap单单看几篇一知半解的文章远远还不够,要结合者文章去翻一下源码,仔细看看一下map put方法的过程。慢慢去了解其中的种种奥妙,你会感叹java jdk作者的能力的。感受一下jdk 源码的巧妙 所属位置? 首先我们先看一下map 的所属位置,继承在map接口下 什么是hash:? 百度百科:Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 ? 简单讲就是通过一系列算法得到一个hash值的算法,其中得到的这个hash值就叫做hashCode,也就是表示在hash 表中的位置的值 为什么使用haseCode 呢:? 快 就一个字,hashcode 值就可以看做值的数组下标,通过内存地址直接查找,没有过多的判断。通过内存空间换取时间的一种操作。 存储结构? 1.8中hashmap 是数组和链表 外加红黑树构成的,当链表的长度大于8的时候,链表会转变成红黑树。这种数据结构的原因主要就是为了解决hash冲突,当不同的key hash 值想同的时候,数组对应的值就会链式存储 链表: 红黑树: PUT方法? hashmap中最重要的就是put 的过程,精髓也是put 的过程,这部分的源码自己手写一遍都不为过,先看一下hashmap 的put 方法大致流程图 在put 方法里有两个我们需要关注的,敲重点重点!!!!!!: 一.resize扩容: hashMap 中的数组,即存储数据的散列表,下文我们一table 来称呼
二.hash冲突: 当产生相同的hash 值并且key 不同的时候,即产生了hash冲突,随机会将不同的key 但是相同的hash 值的数据以链表的形式存储在具体的数组中,其位置就是经过hash 计算产生的hash code ,随后在java 1.8中优化查询的速度,当相同位置的链表的数量长度超过8时会将链表转换成红黑树,就变成了了数组对应红黑树。具体的转换过程过于复杂感兴趣的可以去研究一下他的方法。下面代码就是当put 过程中产生了相同的hash值时的处理。
get方法:? get 方法就比较简单了就是通过key 的hash code值去数组中获取数据,当不是链表的时候直接返回数组中的Node 中的value 值即可。当链表或者红黑树已经形成了以后则进行遍历查询,没有什么特别需要注意的点,只要明白了put 方法,get 方法自然就明白了
线程不安全 ? 我们常常被问到hashmap 线程安全吗? 答案是不安全呢,具体为什么呢,其实有以下原因,也就是我们上边讲的在put 时候两个需要重点关注的问题。
参考: https://zhuanlan.zhihu.com/p/21673805 https://www.lagou.com/lgeduarticle/18098.html |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 10:21:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |