IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> HashMap个人总结(参考三太子熬丙的公众号文章) -> 正文阅读

[数据结构与算法]HashMap个人总结(参考三太子熬丙的公众号文章)

1、结构和底层原理

? ? ? ? a、数据结构由数组 + 链表组合构成,存储 key -value 的实例,java7叫 Entry,Java8叫Node,每个节点包含 int 的 hash 值,key value 和下一个 node 节点的引用。插入时先根据 hash 值计算将要存放的 index 位置,该位置上如果有实例,则在该位置的链表上尾插。

? ? ? ? b、首先了解 HashMap 的扩容机制,默认容量为16,默认加载因子为0.75,就是在12后再插入就要扩容(resize())了,扩容为原来的两倍,扩容是创建新的数组,再遍历原来的rehash进新的容器中,HashMap index 值的计算方法为 ?index = HashCode(Key) & (Length - 1),扩容后长度变了,重新计算出来的位置也就变了,而且使用的是 & 与运算,效果和取模相同但是效率更快。

? ? ? ? c、java8之前采用头插法,因为作者认为后插入的数据更可能被查,有利于效率,在多线程情况下可能会出现环形链表,新数据插入到链表是,头插,指向之前的数据,但是可能正好要扩容了,数据重新存储可能又指向这个数据,导致互相指向而出现环形链表。? ? ? ? ? ? ? ?

?????????????尾插就不一样了,一样的情况不会发生,不会出现死循环,但是没有加同步锁可能会出现之前put进去的值,在get时获取的不是同一个,所以线程安全仍不可保证。

? ? ? ? d、HashMap的默认初始容量 为16(1<<4),自己创建时加也最好使用2的幂次,因为这样位运算方便,计算 index 时,用长度-1 与上 hash 值,长度-1的二进制是后面位上全是1,所以只要存入的 key 的 hash 值均匀,实现均匀分布。

2、HashMap 的例子

? ? ? ? a、创建类时要重写 equals 和 hashcode 方法,所有类都继承自 Object ,未重写前比较的是两个对象的地址,new 出来的两个对象地址一定是不同的,所以要重写 equals 方法比较属性,也要同时重写 hashcode 方法,因为如果不重写,hashcode 方法计算出的 hash 值可能不同,存放不同位置,但是他们 equals 相等,这样会造成混乱。

? ? ? ? b、线程安全的环境下使用 HashTable 或 CurrentHashMap,但是 HashTable 是在方法上加锁,并发度很低,效率低下,而 CurrentHashMap 使用分段锁机制,效率会好很多。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:53:24  更:2021-10-16 19:53:31 
 
开发: 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年11日历 -2024/11/26 7:29:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码