首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java的map和Go的map的区别

Java的map和Go的map的区别

作者头像
人生海海山山而川
修改2021-07-29 18:00:24
修改2021-07-29 18:00:24
1.4K0
举报
文章被收录于专栏:java和go的学习java和go的学习

我们先说Java 的HashMap 跟Go map的实现的共同点,1.都是利用 键值对的 key 得到一个 hashCode,算出桶的位置,什么是桶 其实就是一个数字,类似这样的图

table 对应的其实就是数组,Entry就是桶 也就是数组的位置,hashCode通过一个位移算法得到这个下标,也就确定一个桶的位置,这就是 你存key,value的位置 ,这里就引出一个问题,如果hashCode一样或者hashCode算出的下标位置 一样怎么办,也就是我们说的hashCode碰撞了,那原来位置放的东西怎么办?java 里面就是按照上面的图 ,看得出来,h每个桶里面其实是一个链表,链表的特点就是上一个元素指向一个元素,也就是如果发生碰撞就替换原来的位置。这时候就要判断一下 了如果 hashCode一样那就是替换,不一样当前位置 指向 旧的Entry。

Go的实现跟java的map实现 基本一致,那哪里不一样呢,同样的hashCode 算出 桶的位置,但是 Go的算法有意思的地方 比如一个hashCode 7894561234,hashCode 后面我故意放斜体,78945Go的算法里面把它叫 高位hash, 61234叫低位hash ,低位hash算出 桶的位置,高位 hash找出桶中的key,这边就是java不一样的地方,Entyr里面放的是一个数组,不是java一样 key,value 放一起的,而是下面图这样的形式

这里蓝色的就是高位hash,用来检索当时key的查找,找到key 很容易就算出 value的位置,同样这边需要高位hash判断 一样就替换,不一样就往数组的下一个位置放。那低位hash出现碰撞怎么办? 出现碰撞 不是像java一样 直接指向一下一个节点,但是判断这个低位hash的桶 也就是 图上的数组满了没?没有满就可以继续放。满了才指向下一个节点 同样的下一个节点 还是一个桶 桶里面还是图上的数组 。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档