java 集合 3 - HashMap

本文详细介绍了Java HashMap的数据结构和操作,包括构造器、数组实体、put和get方法的工作原理,以及线程安全性问题。HashMap使用数组加链表/红黑树的方式存储键值对,当元素个数超过加载因子与容量的乘积时会进行扩容。线程不安全的HashMap在高并发环境下可能导致死循环和死锁,推荐使用ConcurrentHashMap。
摘要由CSDN通过智能技术生成

参考文章:什么是HashMap?图解集合4:HashMap

接下来通过 jdk 1.8 进行分析

HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。

特点:
1. HashMap的key和value都允许null值,当key相同时, 值会覆盖,即key是唯一的。
2. HashMap是无序的,存值时是根据key的hashcode进行映射,因而存入顺序在数组中的实际顺序会被打乱。
3. 线程不安全

构造器

    static final float DEFAULT_LOAD_FACTOR = 0.75f;

    // 只选取了两个较常用的构造器
    public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }

loadFactor指加载因子,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 resize方法将容量翻倍。

可见默认的加载因子为0.75,即HashMap中元素个数超出总大小的75%时,容量将扩大。

数组实体


    /**
     * The table, initialized on first use, and resized as
     * necessary. When allocated, length is always a power of two.
     * (We also tolerate length zero in some operations to allow
     * bootstrapping mechanics that are currently not needed.)
     */
    transient Node<K,V>[] table;

注释:数组实体,第一次使用时初始化,必要时进行扩容,当分配容量时,数组大小始终为2的幂。

数组元素数据结构

    static class Node<K,V> implements Map.Entry<K,V> {
        
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值