Java集合之HashMap

本文深入探讨了Java中HashMap的数据结构和实现原理,包括JDK1.8的变化。HashMap基于哈希表存储键值对,采用数组+链表/红黑树的方式解决哈希冲突。在多线程环境下,HashMap可能存在线程不安全问题。HashMap的扩容机制通过重新哈希确保高效性,而get()和put()方法依赖键对象的hashCode()和equals()。面试中,理解这些基本概念以及HashMap的工作原理至关重要。
摘要由CSDN通过智能技术生成

HashMap

HashMap是什么

HashMap是Java常用的用来储存键值对的数据结构,它是线程不安全的,可以储存null键值

结构图如下:
结构图
从结构图可以看出:
1、HashMap继承于AbstractMap,实现Map,Serializable,Cloneable接口
2、实现了Cloneable,能被克隆
3、实现了Serializable,支持序列化
4、继承AbstractMap,说明元素以K-V(键值对)形式存储

HashMap源码分析(JDK1.8)

数据结构

JDK1.8之前 HashMap底层由数组+单链表实现
JDK1.8之后,当链表长度大于8时,链表转成红黑树形式存储数据
数据结构图如下:
hashmap
实现代码:

static class Node<K,V> implements Map.Entry<K,V> {
   
        final int hash; // 用来定位数组索引位置
        final K key;
        V value;
        Node<K,V> next; // 下一个元素
}

可以看出,Node就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。

构造函数

    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
    }

    public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
    }

从构造函数中我们可以得到几个关键参数,initialCapacity(初始容量),loadFactor(负载因子)

    int size; // 元素个数
    int modCount;  // 操作计数
    int threshold; // 所能容纳的key-value对极限 
    final float loadFactor;// 负载因子

Node[] table的初始化长度length(默认值是16)&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值