HashMap源码分析

时间:2021-08-06
本文章向大家介绍HashMap源码分析,主要包括HashMap源码分析使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

HashMap在面试和工作中使用很多。

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH函数(计算机算法领域) 概述 HashMap是Map接口下一个线程不安全的,基于哈希表的实现类,它解决冲突的方法是链表法,所以它的数据结构是数组+链表 JDK1.8之后的数据结构则变为数组 + 链表 + 红黑树

HashMap有两个参数影响其性能:初始容量和扩容因子。默认初始容量是16,加载因子是0.75。

initialCapacity 初始容量,通过tableSizeFor计算会返回一个比给定整数大且最接近的2的幂次方整数,并赋值给threshold
默认初始容量为16,必须为2的幂
loadFactor 扩容因子 默认为DEFAULT_LOAD_FACTOR 即0.75(在0.75属于时间和空间的一个平衡)
当容量一定是2^n时,h & (length - 1) == h % length
MIN_TREEIFY_CAPACITY:
是指当桶被转化为树形结构的时候,此时桶所拥有的最小容量

MAXIMUM_CAPACITY = 1 << 30;这是定义容量的最大值。

public HashMap()// 默认构造函

public HashMap(int initialCapacity, float loadFactor) / /指定“容量大小”和“加载因子”的构造函数

public HashMap(int initialCapacity) // 指定“容量大小”的构造函数

public HashMap(Map<? extends K, ? extends V> m) // 包含“子Map”的构造函数,将m中的全部元素逐个添加到HashMap中

哈希冲突的解决方法:开放地址法,链地址法,公共溢出法,再哈希法

小结

(1) 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。

(2) 负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊。

(3) HashMap是线程不安全的,不要在并发的环境中同时操作HashMap,建议使用ConcurrentHashMap。

(4) JDK1.8引入红黑树大程度优化了HashMap的性能。

原文地址:https://www.cnblogs.com/kai-114514/p/15107269.html