关于HashMap
hashMap的底层数据结构是哈希表,哈希表又由数组加链表构成,在执行put操作时,hashMap会根据key进行哈希函数运算,插入数组中,如果哈希冲突那么由于hashMap采用的是链地址法,会对冲突的键值对形成链表,如果哈希值相同并且关键字也相同,那么会直接修改原来的value值,在java8之后,当链表长度大于8并且数组长度大于64时,hashMap会将链表转换成红黑树,提高搜索效率,当红黑树节点不足6时,会重新转换为链表,hashMap是线程不安全的,因为它的扩容机制,当插入大量数据时,红黑树效率也不堪重负,hashMap会扩大到原来2倍,对数据会进行重新插入,在这个过程中,如果同时有两个线程执行put操作,同时触发了hashMap的扩容机制时,就有可能出现链表死循环,数据丢失等问题。线程安全的解决方案Collections.synchronizedMap(new HashMap<>()),ConcurrentHashMap,HashTable<>()