HashMap底层原理详解
底层的数据结构和算法
数据结构
JDK1.7
数组+链表
JDK1.8
数组+链表+红黑树
数组的特点:
查询快,插入、删除慢
链表的特点:
查询慢,插入、删除块
链表没有索引,通过next引用连接
链表查询时从头部节点一个一个往后查,所以会查询速度慢。
ArrayList:底层是数组实现。
LinkedList:双向链表
数组是一段连续的存储单元,对内存的要求比链表要高。
数据比较大,用数组。
hashmap算法
哈希算法也叫散列,就是把任意长度值(key)通过散列算法变换成固定长度的key(地址)通过这个地址进行访问的数据结构。
它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
Hashcode: 通过字符串算出它的ascii码,进行取模(mod),算出哈希表中的下标
哈希冲突产生的原因
通过hashcode算法取出的下标重复。
重复的采用链表结构存储。
JKD8新增的红黑树详解
如果链表太长了,那么查询会非常慢。从头部开始往后一个一个得查。
红黑树就是为了解决查询慢的问题。
为什么有了红黑树还要保留链表?
红黑树在插入时,速度慢,需要维护红黑树的顺序:
小中大
左中右
当链表长度小于TREEIFY_THRESHOLD=8时,用链表更快。