温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行HashMap源码分析

发布时间:2021-12-08 17:25:26 阅读:118 作者:柒染 栏目:大数据
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章将为大家详细讲解有关如何进行HashMap源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

代码基于JDK 1.8

基数知识

Map是保存了Key-Value键值对的数据集合接口。HashMap是基于HashCode的Map实现。因为基于Key的HashCode进行存储,所以HashMap中Key都是唯一的。

  • HashMap中Key,Value均可以为null。

源码解析

类声明

123
public class HashMap<K, V> extends AbstractMap<K,V> implements Map<K, V>, Cloneable, Serializable {    // ...}
  • Map - AbstractMap<K,V>本身实现了Map<K,V>接口,在这里再次强调了HashMap实现了Map

  • Cloneable 实现了克隆接口

  • Serializable 实现了序列化接口

数据结构

1234567891011121314151617181920
/** * table, 在初次使用时进行初始化, 必要时进行大小调整。 * 在分配大小时,长度总是 2的幂 */transient Node<K,V>[] table;// Node静态内部类,链表数据结构static class Node<K, V> implements Map.Entry<K, V> {    final int hash;    final K key;    V value;    Node<K, V> next;    Node(int hash, K key, V value, Node<K,V> next) {        this.hash = hash;        this.key = key;        this.value = value;        this.next = next;    }}

上面代码描述了HashMap的底层数据结构:数组 + 链表

在1.8中,增加了红黑树,带详细研究…

构造函数

对于构造函数,提供了多个重载,以方便创建实例:

1234
public HashMap()public HashMap(int initialCapacity)public HashMap(int initialCapacity, float loadFactor)public HashMap(Map<? extends K, ? extends V> m)

在构造函数中,initialCapacityloadFactor两个参数对map的性能有很大的影响。

  • initialCapacity: 初始化大小, 即table数组的长度,如果此值太小,可能会因引起table频繁调整数组大小,如果太大,实际内容很少,则造成资源浪费,默认 1 << 4。

  • loadFactor: 加载因子,取值范围(0,1)的浮点数,如果此值太小,可能会因引起table频繁调整数组大小,如果太大,table大小很长时间不调整,调整时内容移动大。默认值0.75

1
i = (n - 1) & h;

计算key在table中的索引,h为key的hashcode,n为当前table的大小。

HashMap为非线程安全Map,其中key和value均可以为null。

关于如何进行HashMap源码分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/140022/blog/4488122

AI

开发者交流群×