JDK1.8中对hashmap的优化

Java编程语言中,最基本的结构就是两种,一个是数组,另一个是模拟指针(引用),全部的数据结构均可以用这两个基本结构来构造的,HashMap也不例外。HashMap其实是一个“链表散列”的数据结构,即数组和链表的结构,可是在jdk1.8里 
加入了红黑树的实现,当链表的长度大于8时,转换为红黑树的结构。java

这里写图片描述

从上图中能够看出,Java中HashMap采用了链地址法。链地址法,简单来讲,就是数组加链表的结合。在每一个数组元素上都一个链表结构,当数据被Hash后,获得数组下标,把数据放在对应下标元素的链表上。算法

*/
    static class Node<K,V> implements Map.Entry<K,V> { final int hash;//用于定位数组索引的位置 final K key; V value; Node<K,V> next;//链表的下一个Node Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value = value; this.next = next; }

 

Node是HashMap的一个内部类,实现了Map.Entry接口,本质是就是一个映射(键值对)。编程

有时两个key会定位到相同的位置,表示发生了Hash碰撞。固然Hash算法计算结果越分散均匀,Hash碰撞的几率就越小,map的存取效率就会越高。数组

HashMap类中有一个很是重要的字段,就是 Node[] table,即哈希桶数组,明显它是一个Node的数组。若是哈希桶数组很大,即便较差的Hash算法也会比较分散,若是哈希桶数组数组很小,即便好的Hash算法也会出现较多碰撞,因此就须要在空间成本和时间成本之间权衡,其实就是在根据实际状况肯定哈希桶数组的大小,并在此基础上设计好的hash算法减小Hash碰撞。那么经过什么方式来控制map使得Hash碰撞的几率又小,哈希桶数组(Node[] table)占用空间又少呢?答案就是好的Hash算法和扩容机制。数据结构

 

若是哈希桶数组很大,即便较差的Hash算法也会比较分散,若是哈希桶数组数组很小,即便好的Hash算法也会出现较多碰撞,因此就须要在空间成本和时间成本之间权衡,其实就是在根据实际状况肯定哈希桶数组的大小,并在此基础上设计好的hash算法减小Hash碰撞。编程语言

这里存在一个问题,即便负载因子和Hash算法设计的再合理,也免不了会出现拉链过长的状况,一旦出现拉链过长,则会严重影响HashMap的性能。因而,在JDK1.8版本中,对数据结构作了进一步的优化,引入了红黑树。而当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特色提升HashMap的性能,其中会用到红黑树的插入、删除、查找等算法性能

相关文章
相关标签/搜索