hashmap是单向链表吗_数据结构解析-HashMap

概要HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,改为了由 数组+链表+红黑树实现,主要的目的是提高查找效率。如图所示:JDK版本实现方式节点数>=8节点数<=61.8以前数组+单向链表数组+单向链表数组+单向链表1.8以后数组+单向链表+红黑树数组+红黑树数组+单向链表HashMap1.继承关系public class H...
摘要由CSDN通过智能技术生成

概要

HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,改为了由 数组+链表+红黑树实现,主要的目的是提高查找效率。

如图所示:

JDK版本

实现方式

节点数>=8

节点数<=6

1.8以前

数组+单向链表

数组+单向链表

数组+单向链表

1.8以后

数组+单向链表+红黑树

数组+红黑树

数组+单向链表

HashMap

1.继承关系

public class HashMap extends AbstractMap

implements Map, Cloneable, Serializable

2.常量&构造方法

//这两个是限定值 当节点数大于8时会转为红黑树存储

static final int TREEIFY_THRESHOLD = 8;

//当节点数小于6时会转为单向链表存储

static final int UNTREEIFY_THRESHOLD = 6;

//红黑树最小长度为 64

static final int MIN_TREEIFY_CAPACITY = 64;

//HashMap容量初始大小

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

//HashMap容量极限

static final int MAXIMUM_CAPACITY = 1 << 30;

//负载因子默认大小

static final float DEFAULT_LOAD_FACTOR = 0.75f;

//Node是Map.Entry接口的实现类

//在此存储数据的Node数组容量是2次幂

//每一个Node本质都是一个单向链表

transient Node[] table;

//HashMap大小,它代表HashMap保存的键值对的多少

transient int size;

//HashMap被改变的次数

transient int modCount;

//下一次HashMap扩容的大小

int threshold;

//存储负载因子的常量

final float loadFactor;

//默认的构造函数

public HashMap() {

this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted

}

//指定容量大小

public HashMap(int initialCapacity) {

this(initialCapacity, DEFAULT_LOAD_FACTOR);

}

//指定容量大小和负载因子大小

public HashMap(int initialCapacity, float loadFactor) {

//指定的容量大小不可以小于0,否则将抛出IllegalArgumentException异常

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal initial capacity: " +

initialCapacity);

//判定指定的容量大小是否大于HashMap的容量极限

if (initialCapacity > MAXIMUM_CAPACITY)

initialCapacity = MAXIMUM_CAPACITY;

//指定的负载因子不可以小于0或为Null,若判定成立则抛出IllegalArgumentException异常

if (loadFactor <= 0 || Float.isNaN(loadFactor))

throw new IllegalArgumentException("Illegal load factor: " +

loadFactor);

this.loadFactor = loadFactor;

// 设置“HashMap阈值”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。

this.threshold = tableSizeFor(initialCapacity);

}

//传入一个Map集合,将Map集合中元素Map.Entry全部添加进HashMap实例中

public HashMap(Map extends K, ? extends V> m) {

this.loadFactor = DEFAULT_LOAD_FACTOR;

//此构造方法主要实现了Map.putAll()

putMapEntries(m, false);

}

3.Node单向链表的实现

//实现了Map.Entry接口

static class Node implements Map.Entry {

final int hash;

final K key;

V value;

Node next;

//构造函数

Node(int hash, K key, V

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值