HashMap:
HashMap底层数据结构,1.7和1.8有什么不同?
- 1.7的底层是数组+链表结构,1.8底层是数组+链表+红黑树。
HashMap扩容机制
- 起始大小为16,loadFactor默认为0.75,阈值是16*0.75=12。超过阈值后,就把数组大小扩大一倍
- 链表树化的条件:数组大小大于等于64,链表长度大于8,要满足这两个条件链表才能变成红黑树
- 若在没有红黑树的条件下,添加元素后数组中某个链表长度大于8而数组长度未达到64,则链表不会树化,数组会扩容一倍。
- 红黑树退化的条件:扩容拆分树时候树元素小于等于6,且红黑树的root,root.left,root.right,root.left.left结点任一为空,也会退化
HashMap中索引怎么计算?
- 计算对象的hashcode,再调用HashMap的Hash方法进行二次哈希,最后对结果与数组大小进行取模运算(或与数组大小-1进行位与运算),二次哈希是为了让哈希分布更加均匀。
HashMap中put(),1.7和1.8有什么不同?
- 1.7是头插法,1.8是尾插法
- 1.7是大于等于阈值且数组没有空位时才扩容,1.8是大于阈值就扩容
HashMap是线程安全的