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

简介: 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);
    }
相关文章
|
5天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
8天前
|
安全 容器
并发编程之的ArrayList安全性的详细解析
并发编程之的ArrayList安全性的详细解析
12 0
|
14天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
44 0
|
14天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
43 0
|
14天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
47 0
|
14天前
yolo-world 源码解析(五)(1)
yolo-world 源码解析(五)
61 0
|
14天前
yolo-world 源码解析(二)(2)
yolo-world 源码解析(二)
58 0
|
28天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
56 1
|
14天前
Marker 源码解析(二)(3)
Marker 源码解析(二)
18 0

推荐镜像

更多