hashMap的底层数据结构是哈希表,哈希表又由数组加链表构成,在执行put操作时,hashMap会根据key进行哈希函数运算,得到他在数组的位置并插入对应链表,如果哈希值相同并且关键字也相同,那么会直接修改原来的value值,在java8之后,当链表长度较大时,hashMap会将链表转换成红黑树,提高搜索效率,当红黑树长度不足时,会重新转换为链表,hashMap是线程不安全的,因为它的扩容机制,当插入大量数据时,红黑树效率也不堪重负,hashMap会扩大到原来2倍,对数据会进行重新插入,在这个过程中,如果同时有两个线程执行put操作,同时触发了hashMap的扩容机制时,就有可能出现链表死循环,数据丢失等问题。