HashMap详解

本文详细介绍了HashMap的特点、存储位置、主要属性参数和构造器,重点讨论了其底层实现,包括JDK7和JDK8的哈希计算方法、扩容机制和线程安全性。此外,还详细阐述了HashMap的主要方法如put、get以及tableSizeFor()的实现,并探讨了遍历HashMap的各种方式。文章还强调了HashMap在多线程环境中的问题以及JDK1.8的优化,如使用尾插法和红黑树降低冲突。

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

阅读前需知:此文章是小白我在学习过程中做的笔记,可能有许多错误之处,欢迎大家指出并提出宝贵的意见,感谢参考的原创文章的作者们!
 也欢迎各位到本人的Github笔记里观看,蟹蟹大家!

更多个人笔记以及面试技巧可以到本人的Github上观看:Java_Note

一、基本介绍

1、特点

解决冲突:链地址法(拉链法)

底层实现:数组+链表+红黑树(JDK1.8增加了红黑树部分)

允许空键 和 空值

image-20200603233725215

2、存储位置

当系统决定存储 HashMap 中的 key-value 对时,完全没有考虑 Entry 中的 value,仅仅只是根据 key 来计算并决定每个 Entry 的存储位置。这也说明了前面的结论:我们完全可以把 Map 集合中的 value 当成 key 的附属,当系统决定了 key 的存储位置之后,value 随之保存在那里即可

3、主要属性参数

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认(桶)数组长度2^4=16
static final int MAXIMUM_CAPACITY = 1 << 30; // 最大(桶)数组容量2^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;

4、主要构造器

  • HashMap():构建一个初始容量为 16,负载因子为 0.75 的 HashMap
  • HashMap(int initialCapacity):构建一个初始容量为 initialCapacity,负载因子为 0.75 的 HashMap
  • HashMap(int initialCapacity, float loadFactor):以指定初始容量、指定的负载因子创建一个 HashMap
  • public HashMap(Map<? extends K, ? extends V> m) :包含“子Map”的构造函数

5、Node<K,V>[]底层实现

注意里面的四个变量:

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

    Node(int hash, K key, V value, Node<K,V> next) {
   
    }
    
    

    public final K getKey()        {
    return key; }
    public final V getValue()      {
    return value; }
    public final String toString() {
    return key + "=" + value; }

    public final int hashCode() {
   
        return Objects.hashCode(key) ^ Objects.hashCode(value);
    }

    public final V setValue(V newValue) {
   
        V oldValue = value;
        value = newValue;
        return oldValue;
    }

    public final boolean equals(Object o) {
   
        if (o == this)
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值