JDK1.8HashMap原理和源码分析(java面试收藏)

JDK1.8HashMap原理和源码分析(java面试收藏)

ID:43347448

大小:80.55 KB

页数:11页

时间:2019-10-01

JDK1.8HashMap原理和源码分析(java面试收藏)_第1页
JDK1.8HashMap原理和源码分析(java面试收藏)_第2页
JDK1.8HashMap原理和源码分析(java面试收藏)_第3页
JDK1.8HashMap原理和源码分析(java面试收藏)_第4页
JDK1.8HashMap原理和源码分析(java面试收藏)_第5页
资源描述:

《JDK1.8HashMap原理和源码分析(java面试收藏)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、JDK1.8的新HashMap分析 一、综述    Java中HashMap是非常常用的容器,因而也是需要面试官喜欢问的问题,难得有空,就对它进行源码级分析好了。     一上来就看源码会有点头疼,那么先偷个懒,看看网上有没HashMap的分析。 图1HashMap的结构图一直到java1.7为止,HashMap的结构都是这么简单,基于一个数组以及多个链表的实现,hash值冲突的时候,就将对应节点以链表的形式存储。这样子的HashMap性能上就将抱有一定疑问,如果说有成百上千个节点在hash时发生碰撞,存储一个链表中,那么如果要查找其中一个节点,那将不可避

2、免的花费0(N)的查找时间,这将是多么大的性能损失。这儿问题终于在1.8得到解决。当然解决的代价就是代码变得更加复杂orz….     图2jdk1.8hashmap结构图到了1.8,当同一个hash值的节点数不小于8的时候,将不再以单链表形式存储了,会被调整成一棵红黑树(图中null节点没画)。这就是JDK1.8和1.7的最大区别。好了接下来就按照HashMap的成员域、构造函数、put函数来分析下HashMap。二、域transientNode[]table;HashMap的散列表 transientSet>en

3、trySet; transient intsize;记录HashMap中存储了多少个键值对 transient intmodCount;mod是modify的缩写,hashMap的结构发生结构变化时会记录一次。 intthreshold;当size大于这个数时,就进行一次扩容,即调用resize()函数 final floatloadFactor;这是一个比例参数,当table中已经被占用的元素数与table总长度的比例不小于这个参数的时候,就会发生table的扩容,每次扩容都以2倍大小进行扩容,注意resize()函数 还有几个参数

4、需要解释下:static finalint DEFAULT_INITIAL_CAPACITY =1<<4;默认初始化table的大小static finalint MAXIMUM_CAPACITY =1<<30;table的最大大小 static finalfloat DEFAULT_LOAD_FACTOR =0.75f;默认loadFactor大小 static finalint TREEIFY_THRESHOLD =8;当节点冲突数达到8时,就会对hash表进行调整,如果table的长度小于64,那么会进行table扩容,如果不小于64,那么会将因冲突

5、形成的单链表调整为红黑树。 static finalint UNTREEIFY_THRESHOLD =6;这个参数还不是很明白,有可能在删除冲突节点之后,可能同hash的节点数低于这个值时,将红黑树重新恢复为单链表。 static finalint MIN_TREEIFY_CAPACITY =64;注意到TREEIFY_THRESHOLD解释,不小于64时仅对table进行扩容,这个64就是指这个值。三、构造函数Node节点是对Key-Value的包装,是存储在HashMap中的节点,由于代码简单,就不做分析了。    static class Node<

6、K,V> implements Map.Entry{        final int hash;        final K key;       V value;       Node next;        Node(int hash,K key,V value,Node next){            this.hash = hash;            this.key = key;            this.value = value;            this.next = next;  

7、     }         public final KgetKey()       { return key;}        public final VgetValue()     { return value;}        public final StringtoString(){ return key + "=" + value;}         public final int hashCode(){            return Objects.hashCode(key)^Objects.hashCode(value);   

8、    }         public final VsetVa

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。