Skip to content

八股

集合

  • Arraylist 的扩容机制
    • 扩容至原先容量的 1.5 倍,扩容会造成拷贝
  • 并且 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中链表新元素添加到链表的尾结点