HashMap底层原理

242 阅读1分钟

HashMap底层原理详解

底层的数据结构和算法

数据结构

JDK1.7

数组+链表

JDK1.8

数组+链表+红黑树

数组的特点:

查询快,插入、删除慢

链表的特点:

查询慢,插入、删除块

image.png

链表没有索引,通过next引用连接

链表查询时从头部节点一个一个往后查,所以会查询速度慢。

ArrayList:底层是数组实现。

LinkedList:双向链表

数组是一段连续的存储单元,对内存的要求比链表要高

数据比较大,用数组。

hashmap算法

哈希算法也叫散列,就是把任意长度值(key)通过散列算法变换成固定长度的key(地址)通过这个地址进行访问的数据结构。

它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

image.png

Hashcode: 通过字符串算出它的ascii码,进行取模(mod),算出哈希表中的下标

image.png

哈希冲突产生的原因

通过hashcode算法取出的下标重复。

重复的采用链表结构存储。

image.png

JKD8新增的红黑树详解

如果链表太长了,那么查询会非常慢。从头部开始往后一个一个得查。

红黑树就是为了解决查询慢的问题。

image.png

为什么有了红黑树还要保留链表?

红黑树在插入时,速度慢,需要维护红黑树的顺序:

小中大

左中右

当链表长度小于TREEIFY_THRESHOLD=8时,用链表更快。