java-HashMap源码学习

阅读提示:HashMap源码在不同版本情况下,具体源码可能不一样(优化问题),但功能几乎是相同的(博主1.8)

什么是Hash?

hash表是一种数据结构,它拥有惊人的效率,它的时间复杂度低到接近O(1)这样的常数级。

hash表的实现主要是:
1.计算存储位置的hash函数。
2.处理哈希冲突的方法。
3.hash的物理存储。

hash函数

它的目的是通过一个key选出(映射)一个唯一的存储地址。

最常见的hash函数:f(key)=a*key+b
这里a,b为常数(不为0),f(key)就是计算出的哈希值
一般一个hash函数的设计好坏,直接影响到效率。

哈希冲突

hash冲突定义:当两个key相同时计算的hash值会一样,导致冲突。

hash冲突解决部分方法:
**开放定地址:**找下一块地址(另一个hash表(另一个未用过的hash值·),无限多)
**再散列函数法:**一个hash函数解决不了,就两个,两个不行就三个…
**链地址法(hash桶(此处链表)的概念):**数组+链表,将具有相同hash的同义词按次序放入链表,并链表存在数组。链表的hash值以数组hash值开始确定新的hash(不担心与其它数组的hash相同)
还有的就不做介绍了

物理存储

物理存储结构:顺序|链式存储
hash表的主干永远都是一个数组
一般的hash只需要一个数组来存储,一般以数组下标做hash值。
在链地址法中需要用到链表。

什么是Map?

Map在计算机概念是一个key-value(唯一性)键值对

什么是HashMap?

根据前面的铺垫,
hashMap的存储主干是一个数组(源码中的Node(有些是Entry)对象数组),
Node(Entry)对象包含了Key-Value属性

hashMap处理hash冲突:java1.8后,使用的是链地址法。

数据存储结构如下:
在这里插入图片描述

在拥有链表的情况下,hashMap的查询效率必然是低一些的,复杂度提高到o(n)
但1.8利用了红黑树数据结构,又将复杂度降为了o(Log(n))

HashMap的源码分析

1.构造函数(4个)

部分成员变量:
///
transient 关键字:再被修饰后变量序列化将不可见
///
threshold:初始空间(initialCapacity传入参数)
loadFactor:负载因子
modCount:是快速失败的判断标准(在迭代时,其他线程访问Map,并导致其结构改变,会抛异常)
table:节点Set集合(HashMap主干,是个数组)
initialCapacity默认为16,loadFactory默认为0.75

负载因子在0.75时效率最好(数学统计学验证),用于衡量空间利用的方法选择

hashMap会扩容且容量永远是2的幂

	合理判断参数,就结束构造
 	public HashMap(int initialCapacity, float loadFactor) {
   
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }

 	 合理判断空间大小参数,使用默认负载参数就结束构造
    public HashMap(int initialCapacity) {
   
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

 	 /使用默认参数就结束构造
    public HashMap() {
   
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }

	构造一个具有相同的映射关系与指定Map一个新的HashMap。 HashMap中与默认负载因数(0.75)和初始容量足以容纳在指定的地图的映射创建
    public HashMap(Map<? extends K, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值