JDK1.8 HashMap原理和扩容机制

本文介绍了JDK1.8中HashMap的实现原理,包括其主要成员变量、初始化过程、存入数据的逻辑以及扩容机制。HashMap采用数组+链表+红黑树的方式存储键值对,当数据量达到特定阈值时进行扩容。在初始化时,构造函数会确保容量为2的幂值以优化性能。在存入数据时,会根据哈希函数确定位置,如果遇到冲突则处理为链表或红黑树。扩容时,HashMap会创建新的两倍大小的数组,并迁移原有数据。
摘要由CSDN通过智能技术生成


简介

HashMap 是一种Java中常用的数据结构,采用数组+链表+红黑树的方式存储键值对数据,通过哈希函数散列映射方式,使得HashMap的查询数据的数据比较快。

HashMap结构如下图所示:
在这里插入图片描述


一、主要的成员变量

	// 当前存储数据容量
	transient int size;
	// 当size 大于threshold时,将触发扩容操作
    int threshold;
    // 加载因子
    final float loadFactor;
    // 修改数据次数
    transient int modCount;
    // 默认初始容量 16
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
    //最大容量
    static final int MAXIMUM_CAPACITY = 1 << 30;
    //默认加载因子
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    //当链表长度大于该值时,链表转为红黑树
    static final int TREEIFY_THRESHOLD = 8;
    // 当红黑树节点数小于该值时,转为链表
    static final int UNTREEIFY_THRESHOLD = 6;
    //存储数据的数组
    transient Node<K,V>[] table;

当HashMap的容量大于threshold的值时,将进行扩容;

默认情况下,HashMap容量为16,加载因子为0.75,即当HashMap中的数据量达到 16 X 0.75 = 12 时,将触发扩容操作。

实际存储键值对的是Node内部类:

    static class Node<K,V> implements Map.Entry<K,V> {
   
        final int hash;
        final K key;
        V value;
        Node<K,V> next;

二、初始化

HashMap有四个构造函数:

	// 不带参构造函数,加载因子为默认的0.75
    public HashMap() {
   
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }
    // 指定初始容量,加载因子为默认的0.75
    public HashMap(int initialCapacity) {
   
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    // 另一个map对象,初始化后,将存放该map对象的引用
    public HashMap(Map<? extends K, ? extends V> m) {
   
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
    }
    // 指定初始容量和加载因子
    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</
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值