HashMap 源码分析 基于1.8

1、个人总结及想法:

(1)1.8相比较于1.7的变化?

HashMap的底层数据结构大家应该都比较清楚了,就是数组+链表,链表主要用来解决hash冲突,使用了链地址法的方式来解决,1.8的改动主要就是hash冲突时候,一是在进行链表插入时由1.7的头插法变成了尾插法,第二个原来链表是一个单链表,但是现在超过红黑树的阀值过后就会自动升级为红黑树,阀值是链表节点超过8个节点(建立在数组已经扩容到64,否则优先选择扩容来解决冲突)。当链表节点少于6个时红黑树会退化成普通链表。

(2)1.8会出现1.7之前并发扩容节点转移时出现死循环的过程吗?

不会,因为1.8在扩容时不再是像原来一样转移,而是分成了两个链表,然后移动到新数组的原位置和原位置+length处,这样最多可能出现重复扫描,但不会出现死循环的情况。但是依然是线程不安全的。

2、源码分析:

(1)、重要属性:

 1  private static final long serialVersionUID = 362498820763181265L;
 2     //默认值
 3     static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
 4
 5     //最大值
 6     static final int MAXIMUM_CAPACITY = 1 << 30;
 7
 8     //负载因子
 9     static final float DEFAULT_LOAD_FACTOR = 0.75f;
10
11     //转化为红黑树的阀值
12     static final int TREEIFY_THRESHOLD = 8;
13
14     //红黑树退化成链表阀值
15     static final int UNTREEIFY_THRESHOLD = 6;
16
17    //转化为红黑树时最小的数组大小
18     static final int MIN_TREEIFY_CAPACITY = 64;
19
20   //节点数据结构
21     static class Node<K,V> implements Map.Entry<K,V> {
22         final int hash;
23         final K key;
24         V value;
25         Node<K,V> next;
26
27         Node(int hash, K key, V value, Node<K,V> next) {
28             this.hash = hash;
29             this.key = key;
30             this.value = value;
31             this.next = next;
32         }
33
34         public final K getKey()        { return key; }
35         public final V getValue()      { return value; }
36         public final String toString() { return key + "=" + value; }
37
38         public final int hashCode() {
39             return Objects.hashCode(key) ^ Objects.hashCode(value);
40         }
41
42         public final V setValue(V newValue) {
43             V oldValue = value;
44             value = newValue;
45             return oldValue;
46         }
47
48 //重写了equals方法
49         public final boolean equals(Object o) {
50             if (o == this)
51                 return true;
52             if (o instanceof Map.Entry) {
53                 Map.Entry<?,?> e = (Map.Entry<?,?>)o;
54                 if (Objects.equals(key, e.getKey()) &&
55                     Objects.equals(value, e.getValue()))
56                     return true;
57             }
58             return false;
59         }
60     

原文地址:https://www.cnblogs.com/yangquan95/p/8473969.html

时间: 2024-11-10 12:09:50

HashMap 源码分析 基于1.8的相关文章

HashMap源码分析-基于JDK1.8

以下内容翻译于HashMap类的注释 HashMap是map接口的基础实现类.这个实现提供了所有可选的Map接口操作.并且允许null键和null值.HashMap类和Hashtable类差不多,只是HashMap不是线程完全的,并且HashMap允许null值和null键.这个类不保证map元素的顺序,也不保证顺序会随着时间保持不变. 假如hash函数能够使元素在桶中(buckets)均匀地分散,HashMap对于基本的get,put操作提供稳定的性能.集合视图的遍历需要的时间和HashMap

【JAVA集合】HashMap源码分析(转载)

原文出处:http://www.cnblogs.com/chenpi/p/5280304.html 以下内容基于jdk1.7.0_79源码: 什么是HashMap 基于哈希表的一个Map接口实现,存储的对象是一个键值对对象(Entry<K,V>): HashMap补充说明 基于数组和链表实现,内部维护着一个数组table,该数组保存着每个链表的表头结点:查找时,先通过hash函数计算hash值,再根据hash值计算数组索引,然后根据索引找到链表表头结点,然后遍历查找该链表: HashMap数据

HashMap源码分析(转载)

一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同.)此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap. Map map = Coll

Java集合系列之HashMap源码分析

一.HashMap简介 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作(get和put)提供稳定的性能. ps:本文中的源码来自jdk1.8.0_45/src. 1.重要参数 HashMap的实例有两个参数影响其性能. 初始容量:哈希表中桶的数量 加载因子:哈希表在其容量自动增加之前可以达到多满的一种尺度 当哈希表中条目数超出了当前容量*加载因子(其实就是HashMap的

Java集合之HashMap源码分析

一.HashMap简介 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作(get和put)提供稳定的性能. ps:本文中的源码来自jdk1.8.0_45/src. 1.重要参数 HashMap的实例有两个参数影响其性能. 初始容量:哈希表中桶的数量 加载因子:哈希表在其容量自动增加之前可以达到多满的一种尺度 当哈希表中条目数超出了当前容量*加载因子(其实就是HashMap的

Java中HashMap源码分析

一.HashMap概述 HashMap基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.(除了不同步和允许使用null之外,HashMap类与Hashtable大致相同)此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap. Map map = Collections.sync

HashMap源码分析--jdk1.8

JDK1.8 ArrayList源码分析--jdk1.8LinkedList源码分析--jdk1.8HashMap源码分析--jdk1.8 HashMap概述 ??1. HashMap是可以动态扩容的数组,基于数组.链表.红黑树实现的集合.??2. HashMap支持键值对取值.克隆.序列化,元素无序,key不可重复value可重复,都可为null.??3. HashMap初始默认长度16,超出扩容2倍,填充因子0.75f.??4.HashMap当链表的长度大于8的且数组大小大于64时,链表结构

[Java] HashMap源码分析

1.概述 Hashmap继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口.它的key.value都可以为null,映射不是有序的. Hashmap不是同步的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap. Map map = Collections.synchronizedMap(new HashMap()); (除了不同步和允许使用 null 之

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法 1.spreadOutApp尽量平均分配到每个executor上: 2.非spreadOutApp尽量在使用单个executor的资源. 源码分析 org.apache.spark.deploy.master.Master 1.首先判断,master状态不是ALIVE的话,直接返回2.调度driver3. Application的调度机制(核心之核心,重中之重) 源码如下: 1 /*