1. HashMap的底层是数组和链表,jdk1.8之后加了红黑树。
HashSet的底层是HashMap, 其存储的对象在key 里面,
定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。 private static final Object PRESENT = new Object();
HashMap的value 可以是 null, key 也可以 null.所以使用的是containKey来判断是非存在某个key,而不能通过get(key).
初始容量, 加载因子。
默认容量等于初始最大容量 * 加载因子。
HashMap的内部数组的默认长度16, 会自动扩容
存值的过程是:put(key,value):
hashcode() 和 equals()来判断key, 如果存在则替换值,所以在便利的时候后者会覆盖前者(key相同的时候)。
index数组下标的计算方式:
length: HashMap的主干部分(数组tab)的长度
int index = hash() & length -1
tab[index]: Node对象放的位置。
HashMap不是线程安全的
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
CocurrentHashMap对比HashMap在HashEnty前面加了Segment段
当链表的长度达到一定值(默认为8)之后,会转换成红黑树的结构,如下图:
Hashmap在多线程写入会导致死循环
CocurrentHashMap通过分段锁的机制,实现了多线程写入时的线程安全
下图是链表的长度达到默认值8之后转为红黑树的过程:
currentHashMap 参考:https://blog.csdn.net/liuyuanq123/article/details/80283913
hashTable:
Hashtable实现了Map接口,具有同步的功能。