JDK1.8中HashMap实现

JDK1.8中的HashMap实现跟JDK1.7中的实现有很大差别。下面分析JDK1.8中的实现,主要看put和get方法。

构造方法的时候并没有初始化,而是在第一次put的时候初始化

putVal方法的主要逻辑是这样的:

1、如果数组还没有初始化(数组长度是0),则先初始化

2、通过hash方法计算key的hash值,进而计算得到应该放置到数组的位置

3、如果该位置为空,则直接放置此处

4、如果该位置不为空,而且元素是红黑树,则插入到其中

5、如果是链表,则遍历链表,如果找到相等的元素则替换,否则插入到链表尾部

6、如果链表的长度大于或等于8,则将链表转成红黑树

1、计算hash求位置

2、看第一个元素是不是要找的,是则返回,否则遍历

扩容就是将旧数组的元素移动到新数组

总结:

1、HashMap底层是用数组+双向链表+红黑树实现的

2、插入元素的时候,首先通过一个hash方法计算得到key的哈希值,进而计算出待插入的位置

3、如果该位置为空,则直接插入(包装成Node)

4、如果该位置有值,则依次遍历。比较的规则是,hash值相同,key值相等的元素视为相同,则用新值替换旧值并返回旧值。

5、如果该位置的元素是红黑树结构,则同理,查找,找到则替换,没找到则插入。

划重点:

JDK1.8中HashMap与JDK1.7中有很多地方不一样

1、1.8中引入了红黑树,而1.7中没有

2、1.8中元素是插在链表的尾部,而1.7中新元素是插在链表的头部

3、扩容的时候,1.8中不会出现死循环,而1.7中容易出现死循环,而且链表不会倒置

原文地址:https://www.cnblogs.com/cjsblog/p/8207211.html

时间: 2024-10-02 07:44:44

JDK1.8中HashMap实现的相关文章

JDK1.7中HashMap底层实现原理

一.数据结构 HashMap中的数据结构是数组+单链表的组合,以键值对(key-value)的形式存储元素的,通过put()和get()方法储存和获取对象. (方块表示Entry对象,横排表示数组table[],纵排表示哈希桶bucket[实际上是一个由Entry组成的链表,新加入的Entry放在链头,最先加入的放在链尾],) 二.实现原理 成员变量 源码分析: /** 初始容量,默认16 */ static final int DEFAULT_INITIAL_CAPACITY = 1 <<

jdk1.8中hashmap

1.在jdk1.8以前,hashmap的实现原理是数组+链表,在1.8以后实现就变成了数组+链表+红黑树.这样实现的好处是防止某个链表中的元素数量过多,导致hashmap的整体性能下降,所以在1.8以后改为当链表中的元数量大于8时,就把链表改成红黑树,以提高效率.在红黑树中元素的数量小于6时,就会变成链表. 2.关于hashmap的put()的具体实现如下: final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolea

JDK1.7 中的HashMap源码分析

一.源码地址: 源码地址:http://docs.oracle.com/javase/7/docs/api/ 二.数据结构 JDK1.7中采用数组+链表的形式,HashMap是一个Entry<K,V>[] table数组,JDK1.8采用数组+链表/红黑树实现,当链表长度超过阈值,将链表转为红黑树. Entry代码如下: /** Entry是单向链表. * 它是 “HashMap链式存储法”对应的链表. *它实现了Map.Entry 接口,即实现getKey(), getValue(), se

Java中HashMap底层实现原理(JDK1.8)源码分析

这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JDK1.6.JDK1.7的.现在我来分析一哈最新的JDK1.8的HashMap及性能优化. 在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效

JDK1.8中对hashmap的优化

在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结构,但是在jdk1.8里 加入了红黑树的实现,当链表的长度大于8时,转换为红黑树的结构. 从上图中可以看出,Java中HashMap采用了链地址法.链地址法,简单来说,就是数组加链表的结合.在每个数组元素上都一个链表结构,当数据被Hash后,得到数组下标,把数据放在对应

【1】Jdk1.8中的HashMap实现原理

HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 HashMap的数据结构(字段) 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结构,但是在jdk1.8里 加入了红黑

Jdk1.8中的HashMap实现原理

本文主要参考:美团点评技术团队 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. HashMap的数据结构 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结构,但是在jdk1.8

JDK1.8中的HashMap.HashTable, ConcurrentHashMap有什么区别?

JDK1.8中的HashMap,HashTable,ConcurrentHashMap有什么区别? 答:HashMap是线程不安全的,底层采用数组+链表+红黑树的结构 HashTable是线程安全的,因为使用了Synchronized锁住了整个table,底层采用了数组+链表 ConcurrentHashMap是线程安全的,采用了CAS+同步锁Synchronized对链表头节点进行锁定,底层使用数组+链表+红黑树 HashMap的key和value可以是null,其他两个不行. 原文地址:ht

java8中hashMap

摘自:http://www.importnew.com/20386.html 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap.Hashtable.LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的. HashMap最多只允许