1、hashmap
数组:连续的存储单元。Java.util.ArrayList的底层就是数组。
链表:物理存储单元上非连续的、非顺序的存储结构。lingkedList底层是链表,查找慢,查找慢,查找慢。。。
存储put的时候-----算法是:hashcode
hash碰撞-不能让后面来的数据覆盖,就要应用到链表,后来的元素在原数组中,之前的用指针指向。
get方法 找到hash值判断key和hash,不相等的时候去判断next是否为空,不为空继续向下找。
红黑树是为了解决链表过长产生的效率问题。
一开始不直接用红黑树,是因为红黑树插入太慢,一直在左旋,右旋。>8变
hashmap扩容阈值,数组本身阈值16,但是有个扩容因子,0.75f,就是数组长度>12.就扩容致当前数组长度的2倍。
2、线程安全的情况
并发的情况,并且没有扩容也就是没有调用put方法,只调用get方法。