哈希表的定义:根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“映像”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。
在JDK1.6,JDK1.7中,HashMap采用数组+链表实现,即同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,当hash值相等的元素较多时,通过key值依次查找的效率较低。
在JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值时,将链表转换为红黑树,这样大大减少了查找时间。
哈希表的底层是数组+链表/红黑树的结构。
一 ,哈希表的核心成员
默认初始容量(数组的默认大小):16,2的次方
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
默认的负载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
当map中存储数据达到了75%就会进行扩容
链表扩容的边界,链表长度的阈值,当超过8时,会进行树化
static final int TREEIFY_THRESHOLD = 8;
当大于8以后就会进行扩容,将这8个数据进行平均分配
红黑数转离链表边界,当树中只有6个或以下,转化为链表。
static final int UNTREEIFY_THRESHOLD = 6;
这张图就充分的说明了哈希表是如何的进行存储,下面就去介绍哈希表是如何进行存储数据的过程,以及为什么会出现红黑树的原因展开进行讲解。