HashMap源码深度解析
HashMap源码深度解析 一、重新认识HashMap 什么是HashMap? HashMap底层基于散列(Hash)算法,采用hash表实现键值对集合,继承了AbstractMap,实现了Map接口。最早出现在jdk1.2,允许null键和null值,null键的哈希值为0。需要注意的是HashMap不保证键值对顺序,同时非线程安全。 长啥样? 散列算法分为散列再探测和拉链式,HashMap采用的是拉链式,并在jdk1.8后使用红黑树优化长度大于等于8的链表。也就是说,目前HashMap底层数据结构为: 数组+链表+红黑树 。 数据结构如下图: 如上图所示,HashMap的数据结构采用数组和单链表(或者红黑树)组成,在进行增删改查时首先根据要查找元素的hash值定位到元素所在的数组下标(也称为桶),然后再根据这个桶所存储的元素的类型(单个node,单链表或红黑树)来找到该元素。 当单链表长度大于等于8时,转化为红黑树;当红黑树长度小于6时红黑树转化为链表。 HashMap特点 可以接受null键和null值,null键的hash值时0; 元素无序,可以序列化,线程不安全; 添加,查询的时间复杂度基本都是O(1); 存储元素时,根据键的hash值找到对应的桶。如果出现不同的对象计算出来的hash值相同,也就是hash冲突。为了解决这个问题