HashMap源码分析
概述 HashMap实现了Map<K, V>接口,通过键-值(key-value)的方式存取数据。内部的数据结构是数组+链表(或者Tree),插入时通过key的hash值,映射((n - 1) & hash,其中n为数组的长度)到数组中的位置,如果hash值重复,则在链表的末端插入(当一个链表中的数据大于等于8个时,就将链表转变为Tree),而当数组达到一定值时,会resize,重新创建一个数组,大小是之前的两倍;取出时,也是通过key的hash值,映射到数组的位置,如果刚好是第一个,则返回,否则一直查找到key相等的value并返回,如果还是没找到则分会null。 本文的目标是带着学习的态度,查看HashMap的源码,从put,get,resize三个方法分析它的内部实现。 HashMap数据结构 HashMap继承自AbstractMap<K,V>,实现了Map<K, V>接口(AbstractMap<K,V>也实现了这个接口,为什么没有冲突呢?): Map接口有一个Entry接口,HashMap中内部类Node实现了Entry接口,数据就存放在: Node < K , V > [ ] table ; HashMap内部定义了几个重要参数: // 加载因子默认是0.75,取值越小,hash冲突概率越低,插入和查找速度愈快,但是占用的空间更多 final float