HashMap源码分析

代码基于JDK 1.8

基数知识

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

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

源码解析

类声明

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 实现了序列化接口

数据结构

/**
 * 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中,增加了红黑树,带详细研究...

构造函数

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

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
i = (n - 1) & h;

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

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

转载于:https://www.cnblogs.com/tinyking/p/4478755.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值