HashMap 1.8的源码分析一

本文深入探讨了HashMap1.8的内部实现,包括其继承结构、序列化能力、初始化容量、最大容量、装载因子等核心参数设定,以及1.8版本中新引入的链表转红黑树机制,旨在帮助读者理解HashMap的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashMap 1.8的源码分析一

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {

    private static final long serialVersionUID = 362498820763181265L;

首先它是继承了AbstractMap,这个抽象类里面有很多方法,

  从这个可以看出面向对象的特性,单继承,接口的多实现,

  同时实现了序列号接口,可以进行网络传输,在进行网络传输的时候实体类一般都会实现序列号接口,以便传输,

  在整合redis的时候,如果实体没有进行序列化,是无法传输进入到redis中的value上的

 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

这个是进行初始化容量的,

 1 << 4

这个是位运算: 二进制为 1 向前唯一四位,那么就是10000 那么换成十进制就是2的4次方 就是16,所以hashmap的初始容量为16,

 static final int MAXIMUM_CAPACITY = 1 << 30;

这个是hashmap的最大容量,表示一个很大的值,大概为2的30次方

  static final float DEFAULT_LOAD_FACTOR = 0.75f;

这个表示hashmap的装载因子

static final int TREEIFY_THRESHOLD = 8;

这个是1.8之后特有的,当链表结构到8时就会变成红黑树,

static final int UNTREEIFY_THRESHOLD = 6;

由树变成链表的阀值

 
    
/**
* The smallest table capacity for which bins may be treeified.
* (Otherwise the table is resized if too many nodes in a bin.)
* Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
* between resizing and treeification thresholds.
*/
static final int MIN_TREEIFY_CAPACITY = 64;
 

当桶中的bin被树化时最小的hash表容量。(如果没有达到这个阈值,即hash表容量小于MIN_TREEIFY_CAPACITY,当桶中bin的数量太多时会执行resize扩容操作)这个MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍。

 static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

 

在HashMap中,为了更好的性能,我们希望作为Key的对象提供一个合理的hash函数以便能将其合理的分配到桶中。     而在实际的HashMap中,对从对象获取的hash值又做了调整,代码过程的直接翻译就是:如果Key值为null,返回0;如果Key值不为空,返回原hash值和原hash值无符号右移16位的值按位异或的结果。

 

posted @ 2019-01-30 13:57 动手的程序员 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值