Java深入之HashMap

  一.HashMap的整体架构

      1.HashMap是由Entry[]构建而成,每个Entry都是一个单链表用于解决hash值冲突的问题。

  .HashMap的四种构造方法

      1.指定初始容量大小和加载因子的构造方法。

      2.指定初始容量大小的构造方法,无论我们指定的容量为多少,构造方法都会将实际容量设为不小于指定容量的2的次方的一个数,且最大值不能超过2的30次方

      3.默认构造函数“加载因子”为默认加载因子0.75,初始容量默认是16,并且容量一定是2的幂次方。

      4.包含Map的构造方法。

  .HashMap的put和get方法

      1.HashMap中的Key和Value都可以指定为null。

      2.[put:]如果key不为null,则同样先求出key的hash值,根据hash值得出在table中的索引,而后遍历对应的单链表,如果单链表中存在与目标key相等的键值对,则将新的value覆盖旧的value,比将旧的value返回

   如果key为null,key为null的键值对永远都放在以table[0]为头结点的链表中,当然不一定是存放在头结点table[0]中。

      3.如果key为null,则直接从哈希表的第一个位置table[0]对应的链表上查找。记住,key为null的键值对永远都放在以table[0]为头结点的链表中,当然不一定是存放在头结点table[0]中。

    如果key不为null,则先求的key的hash值,根据hash值找到在table中的索引,在该索引对应的单链表中查找是否有键值对的key与目标key相等,有就返回对应的value,没有则返回null。

  .HashMap的扩容方法

      1.如果容量大于(当前Entry.size*加载因子),那么就将数组扩大为原来的2倍。很明显,扩容是一个相当耗时的操作,因为它需要重新计算这些元素在新的数组中的位置并进行复制处理。因此,我们在用HashMap的时,最好能提前预估下HashMap中元素的个数,这样有助于提高HashMap的性能。

  .Hash值所在索引的位置确定:

      HashMap中则通过h&(length-1)的方法来代替取模,同样实现了均匀的散列,但效率要高很多,这也是HashMap对Hashtable的一个改进。

  .Entry的数组长度为什么是2的幂:

      因为第5条中已经提到,V%(length) == V&(length-1),如果length是偶数的话那么length-1必定是奇数那么和V相与的二进制最后一位奇、偶都有可能是;如果数组长度为奇数,则length-1为偶数,则V&(length-1)相与的必定是偶数位置,那么奇数位置就会空闲则会浪费一半的存储空间,并且碰撞的可能性也会变大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值