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是线程安全的吗?
- 不是的,多线程状态下有可能发生数据丢失。详见:基础篇-52-HashMap_并发丢数据_哔哩哔哩_bilibili
ArrayList:
ArrayList的扩容机制
- 一开始长度为0,放入元素后长度会初始化为10,放满之后再加入元素会扩容成原来的1.5倍。新建原来约1.5倍长度的数组再对原数字进行复制粘贴操作,最后替代原来数组的位置
- 若使用了addAll方法,则会在数组长度和扩容后的长度作比较,选较大的那个作为扩容后的长度