
Java:HashMap的总结
发布日期:2021-05-06 07:32:34
浏览次数:21
分类:精选文章
本文共 1213 字,大约阅读时间需要 4 分钟。
HashMap
HashMap综合了数组和链表的优点,是一个查询,插入删除都容易的数据结构。
(1)创建步骤: ①通过hash算法,找到与key对应的存储位置 ②访问该位置的value,与当前的value的比较,如果相等就返回,不相等找这个位置对应的链表中的值。(2)哈希冲突的解决:
①链地址法:key一样的插入元素就链接到那个结点之后。(数组和链表的结合)
②开放地址法:在插入一个元素的时候,先hash()一下,若是发生哈希冲突,就以当前地址为基准,进行再寻址,若发生冲突再去寻找,直至找到一个为空的地址为止。所以这种方法又称为再散列法。
1)顺序寻址:顺序查看当前table,直到找到当前table的下一个空位;
2)二次寻址:以二次幂查看当前table,直到找到当前的下一个空位。③公共溢出法:一旦由哈希函数得到的地址冲突,就都填入溢出表。所以也就是将其分为哈希表和公共溢出区两个部分。
(4)红黑树:原先当链表中结点大于等于8时,会把链表变成一棵红黑树,小于6时又会转成链表,但是现在通常不这么做了。
(5)hashCode():hashCode实际指的是某一个对象的内存地址返回的一个int型。
(6)rehash() : 之所以要rehash是因为扩容后hash中因为用到了table.length,所以hash出的值一定不一样了,所以要重新hash。
rehash之后可能是: 1)还在那个Index; 2)index+原来table.length(7)HashTable和HashMap的联系与区别:
1)实现类、实现接口:
HashMap继承自AbstractMap,HashTable继承自Dictionnary; 实现接口都是Map、Cloneable、Serializable。2) 默认容量:
HashMap:16 HashTable:113)构造函数:
HashMap在第一次put的时候初始化table HashTale构造函数中初始化table4)put方法:
HashMap | HashTable |
---|---|
是非同步方法 | 是同步方法 |
key/value可为null | key/value不能为null |
2倍方式扩容 | 2倍+1方式扩容(奇数) |
rehash | table中从后往前去遍历,对每一个位置的每一个节点进行rehash,连接到新的位置 |
(该key不存在)尾插 | 头插 |
5)hash算法的差异:
HashMap: hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); index = hash & table.length-1; HashTable: index = (e.hash & 0x7FFFFFFF) % Capacity;(8)WeakHashMap: 可以增加内存利用率,用的是弱引用,不用的可以回收。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月08日 03时36分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解Bug之路-dubbo流量上线时的非平滑问题
2019-03-06
记一次讲故事机器人的开发-我有故事,让机器人来读
2019-03-06
从Linux源码看Socket(TCP)的listen及连接队列
2019-03-06
高德网络定位算法的演进
2019-03-06
高德算法工程一体化实践和思考
2019-03-06
为亿级用户的美好出行而战!高德地图首届算法大赛落幕 95后北邮在读博士带队夺冠
2019-03-06
重温网络编程——常识(三)
2019-03-06
判断一个数是否是2的幂
2019-03-06
js 闭包(新)
2019-03-06
vscode 编辑python 如何格式化
2019-03-06
正则表达针对html(九)
2019-03-06
seo 回忆录百度基本概念(一)
2019-03-06
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
2019-03-06
【golang-GUI开发】qt之signal和slot(一)
2019-03-06
「从零单排HBase 06」你必须知道的HBase最佳实践
2019-03-06
「从零单排canal 04」 启动模块deployer源码解析
2019-03-06
用ThreadLocal来优化下代码吧
2019-03-06
netcore中使用session
2019-03-06
Android 开发学习进程0.25 自定义控件
2019-03-06