ArrayList扩容机制:流程图+源码解析给你整得明明白白

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ArrayList的扩容机制是java基础面试题,是每个java程序员学习路上都会遇到的一个问题,也是大多数人第一次看的java源码,今天布狼牙就带大家来看一下源码.

流程图:

图片.png

add方法:

/**ArrayList的add方法有几个重载,最后会来到这个方法*/privatevoidadd(Ee, Object[] elementData, ints) {
if (s==elementData.length)  //判断是否需要扩容elementData=grow();  //如果需要扩容调用扩容方法elementData[s] =e;  //将数据插入到数组尾size=s+1;  //数组长度更新}

grow方法:

//add方法里调用的grow方法privateObject[] grow() {
returngrow(size+1);
    }    
//实际调用的重载方法privateObject[] grow(intminCapacity) {
//newCapacity就是获得新的容量//Arrays.copyOf是把之前的数组复制到新的数组里returnelementData=Arrays.copyOf(elementData,newCapacity(minCapacity));
    }

newCapacity方法:

//获得扩容后容量privateintnewCapacity(intminCapacity) {
intoldCapacity=elementData.length;
//这句比较关键,新的容量=旧容量+旧容量右移1位(相当于除2)intnewCapacity=oldCapacity+ (oldCapacity>>1);
//判断溢出的,不用管if (newCapacity-minCapacity<=0) {
if (elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
returnMath.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity<0) // overflowthrownewOutOfMemoryError();
returnminCapacity;
        }
//如果不溢出就返回新容量,否则返回int类型上限2147483647-8return (newCapacity-MAX_ARRAY_SIZE<=0)
?newCapacity            : hugeCapacity(minCapacity);
    }
相关文章
|
22天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
6天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
10天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
28天前
|
JSON Java API
在 Java 中解析 JSON ArrayList 的详细指南
【8月更文挑战第23天】
24 1
|
29天前
|
测试技术 Python
python自动化测试中装饰器@ddt与@data源码深入解析
综上所述,使用 `@ddt`和 `@data`可以大大简化写作测试用例的过程,让我们能专注于测试逻辑的本身,而无需编写重复的测试方法。通过讲解了 `@ddt`和 `@data`源码的关键部分,我们可以更深入地理解其背后的工作原理。
25 1
|
1月前
|
算法 安全 Java
深入解析Java多线程:源码级别的分析与实践
深入解析Java多线程:源码级别的分析与实践
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
55 6
|
1月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
68 1
|
1月前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
123 1

热门文章

最新文章

推荐镜像

更多