【大白话说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.synchronizedList或CopyOnWriteArrayList。
相关推荐
niucloud-admin10 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质10 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain37611 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021411 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
步行cgn12 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
IT_陈寒12 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
每天进步一点点km12 小时前
自用-牛客网-华为机试编程模拟题1-python
华为od·华为·面试
lgcgkCQ12 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
泡海椒12 小时前
05-雷达图多维画像-信用评级多维画像
后端
王中阳Go12 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型