hashmap,hashtable,concurrentHashMap集合总结

一,概述

hashmap是使用非常频繁的一个集合,但他是线程不安全的,同时介绍一下concurrentHashMap,hashtable,以及他们的原理,适用场景,以及java7与java8的不同之处。

1.hashMap:

jdk1.7:
hashmap,hashtable,concurrentHashMap集合总结public HashMap(int initialCapacity, float loadFactor)初始化构造函数:
1.Capacity:当前数组的容量,始终保持2^n倍,初始大小为16。
2.loadFactor:负载因子,默认为0.75。
3.当当前数组容量>loadFactor*capacity时就会触发扩容。
在jdk1.7中hashMap使用的是数组+单向链表的结构:
put过程
- 数组初始化,在第一个元素插入HashMap时先做初始化,确认初始数组的大小。
- 根据hashcode值确定存储在哪个数组。如果该位置没有就直接存入,如果以有元素则进行下一步
- 根据equals判断是否相等,如果不相等就直接存入,如果相等,则存入失败。
- 在存入过程中这里要说一下,java7用的是头插法,在多线程的情况下,容易造成死循环。
- 前面说了,当插入时根据容量和负载因子判断是否达到阈值,如果达到就要扩容,扩容后会变为原来的2倍,注意,hashmap扩容很特殊,他是用一个大的新数组特换原来的小数组,并将数组中的值迁到新的元素中。每次扩容都会计算新的位置,重新插入。
JDK1.8
hashmap,hashtable,concurrentHashMap集合总结
在jdk1.8中使用到了数组加链表加红黑树:
put过程:
- jdk1.7中是先扩容再插入,1.8是先插入再扩容
- 当使用链表放数据时,当链表数达到8个后就会将链表转换成红黑树。
get过程:
- 它与1.7不同的是他会判断元素是treenode还是node,他们的取法是不同的。