八股
集合
- Arraylist 的扩容机制
- 并且 Arraylist 不是现成安全的
- 转化为线程安全:
Collections.synchronizedList(list);
HashMap底层实现原理
- HashMap是无序且不安全的数据结构。(字典)
- 使用散列表封闭寻址(每个节点为一个链表来解决哈希冲突)
- 如果相同哈希值,链表的长度超过8,就从链表转换成红黑树,避免极端情况下链表变得很长,使得查询时效率非常低
- 负载因子:用于衡量 HashMap 的“满”程度。
- 扩容阈值(threshold) = 负载因子(loadFactor) x 容量(capacity)
- 性能考虑:如果负载因子太低,那么哈希表会过早地扩容,导致内存浪费。反之,如果负载因子太高,虽然会节省内存空间,但可能会导致更多的哈希碰撞,从而降低查询效率。
- 平衡空间与时间:负载因子提供了空间使用率和时间效率之间的平衡。默认的 0.75 负载因子提供了良好的平衡,适用于大多数场景。
- 避免太频繁的扩容:重新哈希 (rehashing) 或扩容操作是一个相对昂贵的操作,因为它涉及到新数组的创建和所有旧元素的重新定位。设置合适的负载因子可以帮助避免太频繁的扩容。
- 变化
- Jdk1.7:数组 + 链表 ( 当数组下标相同,则会在该下标下使用链表)
Jdk1.8:数组 + 链表 + 红黑树 (预值为8 如果链表长度<=8则会把链表变成红黑树 )
Jdk1.7中链表新元素添加到链表的头结点,先加到链表的头节点,再移到数组下标位置
Jdk1.8中链表新元素添加到链表的尾结点