一、HashMap
1、前言
HashMap是使用结合了数组和链表优点的哈希表实现,是一种键值对(K-V)形式的存储结构。HashMap的key和value都允许为空、value允许重复、无序、非线程安全。HashMap的存储单元Entry有四个属性:
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
int hash;
...
}
存储结构如图:
2、添加数据
(1)HashMap在new的时候构造出了一个大小为16的Entry数组table,Entry内所有数据都取默认值null;
(2)如果key为空会默认放在第0位的数组table位置上(如果为空的key已存在会覆盖,获得数组0的元素,循环Entry.next判断)
(3)key 不为null,根据key对象的hashcode,重新计算hash值,根据新的hash值和数组长度取模计算得到key对象对应的数组下标位置index;
(4)判断key是否存在,存在则覆盖(获得数组index的元素,循环Entry.next判断,先判断hash是否相等再比较key对象);
(5)把新添加的数据新建一个Entry,其nex指向数组index位置上的元素,新的Entry占据数组index位置;
3、扩容
(1)取当前数组table长度的2倍作为新数组的大小,新建newTable数组
(2)轮询原table数组的每一个位置,将每个位置上连接的Entry,跟hash计算重新算出在新newTable数组上的位置,并以链表形式连接
(3)原table上的所有Entry全部轮询完毕之后,意味着原table上面的所有Entry已经移到了新的table上,HashMap中的table指向newTable
4、删除数据
(1)根据key的hash找到待删除的键值对位于table的哪个位置i上
(2)记录一个prev表示待删除的Entry的前一个位置Entry,赋值e为当前Entry
(3)从table[i]开始遍历链表,假如找到了匹配的Entry,要做一个判断,这个Entry是不是table[i]:
a.是的话,table[i]就直接是table[i]的下一个节点,后面的都不需要动
b.不是的话,e的前一个Entry也就是prev,prev的next指向e的后一个节点,也就是next,这样,e所代表的Entry就被踢出了,e的前后Entry就连起来了
5、迭代
(1)初始化HashIterator迭代器时,从table[0]开始循环获得开始的current元素(取到table不为null的元素开始)
(2)根据current的next可以获得当前table[0]中所有Entry
(3)直到current的next为null,说明这个table[0]里面的Entry没有了,开始table[size]的next循环
6、HashMap与Hashtable区别
a.Hashtable是线程安全的,Hashtable所有对外提供的方法都使用了synchronized,也就是同步,而HashMap则是线程非安全的
b.Hashtable不允许空的key和value
c.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey
二、LinkedHashMap
1.前言
LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。与HashMap的区别在于LinkedList是有序的,它的数据结构Entry多了after和before。注意其before、After是用于维护Entry插入的先后顺序的,next是用于在同一个数组位置上的Entry链接指向。存储结构示意图:
2.添加数据
LinkedHashMap继承自HashMap,添加操作基本与HashMap一致,只是多个维护双向链表的操作。新增一个head(head是空元素,只维护了after和before),把Entry里面的after和before按照顺序链起来。head的before指向最后一个元素,after指向第一个元素;中间元素也前后元素通过after和before指向链接;最后一个元素的after指向head,形成链接环
3.删除数据
跟HashMap操作一样,只是维护Entry元素里面after和before指向,把删除元素的前后Entry链接起来
4.迭代
初始化nextEntry从head.after开始,直至next到head终止
备注:
HashMap参考资料:http://www.importnew.com/25049.html
LinkedHashMap参考资料:http://www.importnew.com/25103.html