HashMap源码解析

HashMap

特点 :

  • 基于键的HashCode值唯一 , 键不可以重复
  • 元素无序 , 按照键的哈希值存放
  • key value 允许为空
  • 非线程安全

原理 :

  1. jdk1.7 数组+链表
  2. jdk1.8 数组+链表+红黑树
// 构造方法
// 构造一个空 HashMap使用默认初始容量(16)和默认负载系数(0.75)。  
public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR;}
// 构造一个空 HashMap指定初始容量和默认负载系数(0.75)。  
public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR);}
// 构造一个空 HashMap指定初始容量和装载因子。
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);
}
/*
  构造一个具有与指定映射相同映射的新HashMap。HashMap是用默认负载因子(0.75)和初始容量创建的,初始容量足以容纳指定映射中的映射。
	参数:
		m -其映射将被放置在这个映射中的映射
	抛出:
		如果指定的映射为空,则抛出NullPointerException
*/
 public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
 }
 
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始容量(16)
static final int MAXIMUM_CAPACITY = 1 << 30; // 最大容量,如果较大的值由两个带参数的构造函数隐式指定时使用。一定是2的幂<= 1<<30。
static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认负载系数(0.75)  扩容2倍
static final int TREEIFY_THRESHOLD = 8; // 树化阈值 链表转成红黑树的阈值,在存储数据时,当链表长度大于8时,则将链表转换成红黑树
static final int UNTREEIFY_THRESHOLD = 6;  // 树退化阈值 红黑树转为链表的阈值 当原有的红黑树内数量小于6时,则将红黑树转换成链表
/*
   当哈希表中的容量大于该值时,才允许树形化链表 (即 将链表 转换成红黑树)
   否则,若桶内元素太多时,则直接扩容,而不是树形化
   为了避免进行扩容、树形化选择的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD
*/
static final int MIN_TREEIFY_CAPACITY = 64; // 最小树形化阈值

整理好再更新…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值