【大白话说Java面试题】【Java基础篇】01_说说ArrayList的底层原理/扩容规则

第1题:说说ArrayList的底层原理/扩容规则

📚 回答:

  • 底层实现
    ArrayList基于动态数组实现,初始底层数组长度取决于构造方式:

    • 空参构造:初始长度为0(即elementData为空数组)。
    • 有参构造:直接初始化为指定容量的数组(如new ArrayList<>(20))。
  • 扩容规则

    1. 使用add方法时的扩容规则
    • 空参构造
      • 首次调用add方法时,扩容到默认容量10。
      • 后续扩容:新容量为上一次容量的1.5倍,计算公式为新容量 = 原容量 + (原容量 >> 1)
    • 有参构造
      • 直接初始化为指定容量(如20)。只有当添加的元素数量超过初始容量时,才会触发扩容。
      • 扩容规则与空参构造一致:新容量为上一次容量的1.5倍。
    2. 使用addAll方法时的扩容规则
    • 如果集合原本为空:

      扩容后容量取Math.max(10, 实际元素个数)

    • 如果集合原本有元素:

      扩容后容量取Math.max(原容量1.5倍, 实际元素个数)

💡 面试官视角:

  • 面试官可能会追问"为什么扩容是1.5倍?"答:1.5倍是一个折中值,既能减少频繁扩容的开销,又不会浪费过多内存空间。
  • 面试官可能会问"扩容过程中是如何保证线程安全的?"答:ArrayList本身不是线程安全的,扩容时可能会出现并发问题,比如多个线程同时扩容导致数据不一致。如果需要线程安全,可以使用Collections.synchronizedListCopyOnWriteArrayList
相关推荐
Pluchon1 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生2 小时前
java开发工具(学习第一天)
java·开发语言·学习
她说可以呀2 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
程序员cxuan3 小时前
速度太快了!本地可以跑 DeepSeek-V4-Flash 了
人工智能·后端·程序员
kyriewen4 小时前
我重写了自己用了两年的防抖节流Hook——发现里面藏着3个隐藏bug
前端·javascript·面试
阿祖zu4 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
松仔log4 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才4 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
IT_陈寒4 小时前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端
搜狐技术产品小编20234 小时前
告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
后端·多agent