Map底层

HashMap的底层是一个散列表 即哈希表

哈希表是什么样的数据结构呢?

1.数组加链表的结合体 数组查询效率高 增删效率低 而链表正好相反

        Node<K,V>[] 一维数组 存储的元素是Node

        class Node<K,V>

2.Node类中 分别有以下的属性:

        final int flash key的hashcode执行结果

        final K key 存储的key final V value 存储的value

        Node <k,v> next 一维数组中存储一个单向链表

Map集合中put(key,value)和get(key)的原理:

put

        1.现将key,value封装到Node对象里面

        2.调用key的hashcode算法 得出hash值当做数组的索引 如果对应位置不存在元素

Node就会添加到这个位置上

        3.如果此位置存在了链表 就用key和每个链表中的key进行equals比较 如果均不相等 

新的Node将会加到末尾  如果存在相等 则会替换对应key的value(也是覆盖)

get        

        1.通过key获得对应的hashcode 转化成数组下标

        2.快速定位到对应的位置 如果什么也没有 返回空值null

如果存在单向链表 将key和上面所有的key进行equals对比 找到对应的并返回value值

这样的机制让HashMap的查找和存储效率特别高 不用从头开始找 增删也在链表上完成

重写equals和hashcode

        比较内容而不是地址

        同一个链表上 hash值都相同 因为数组索引相等

        hashcode不能是一个单一的值 否则就是单纯的单向链表 失去意义

        如果全不一样 就变成了一维数组

如何保证HashMap的Key不重复且无序呢?

        不重复:由于上面介绍的机制 相同的key出现时 会覆盖掉原来的value

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值