From 5cf28e8d18d0221216dc0712a81ebaff65306230 Mon Sep 17 00:00:00 2001 From: iloooo <39704559+iloooo@users.noreply.github.com> Date: Wed, 23 Dec 2020 00:25:55 +0800 Subject: [PATCH] =?UTF-8?q?ArrayList=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81JDK=E7=89=88=E6=9C=AC=EF=BC=8C=E8=AF=B4=E6=98=8EJDK7?= =?UTF-8?q?=E5=92=8CJDK8=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B7=AE=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/collection/ArrayList源码+扩容机制分析.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/java/collection/ArrayList源码+扩容机制分析.md b/docs/java/collection/ArrayList源码+扩容机制分析.md index 589aa46c..675f585c 100644 --- a/docs/java/collection/ArrayList源码+扩容机制分析.md +++ b/docs/java/collection/ArrayList源码+扩容机制分析.md @@ -541,7 +541,7 @@ public class ArrayList extends AbstractList ### 3.1. 先从 ArrayList 的构造函数说起 -**ArrayList 有三种方式来初始化,构造方法源码如下:** +**(JDK8)ArrayList 有三种方式来初始化,构造方法源码如下:** ```java /** @@ -596,6 +596,8 @@ public class ArrayList extends AbstractList 细心的同学一定会发现 :**以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。** 下面在我们分析 ArrayList 扩容时会讲到这一点内容! +> 补充:JDK7 new无参构造的ArrayList对象时,直接创建了长度是10的Object[]数组elementData 。jdk7中的ArrayList的对象的创建**类似于单例的饿汉式**,而jdk8中的ArrayList的对象的创建**类似于单例的懒汉式**。JDK8的内存优化也值得我们在平时开发中学习。 + ### 3.2. 一步一步分析 ArrayList 扩容机制 这里以无参构造函数创建的 ArrayList 为例分析 @@ -619,7 +621,7 @@ public class ArrayList extends AbstractList #### 3.2.2. 再来看看 `ensureCapacityInternal()` 方法 -可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)` +(JDK7)可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)` ```java //得到最小扩容量 @@ -635,6 +637,8 @@ public class ArrayList extends AbstractList **当 要 add 进第 1 个元素时,minCapacity 为 1,在 Math.max()方法比较后,minCapacity 为 10。** +> 此处和后续 JDK8 代码格式化略有不同,核心代码基本一样。 + #### 3.2.3. `ensureExplicitCapacity()` 方法 如果调用 `ensureCapacityInternal()` 方法就一定会进入(执行)这个方法,下面我们来研究一下这个方法的源码!