1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

Merge pull request #1035 from iloooo/iloooo-patch-1

ArrayList初始化代码JDK版本,说明JDK7和JDK8初始化差异
This commit is contained in:
Guide哥 2020-12-23 16:12:03 +08:00 committed by GitHub
commit c3fba3e6ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -541,7 +541,7 @@ public class ArrayList<E> extends AbstractList<E>
### 3.1. 先从 ArrayList 的构造函数说起 ### 3.1. 先从 ArrayList 的构造函数说起
**ArrayList 有三种方式来初始化,构造方法源码如下:** **JDK8ArrayList 有三种方式来初始化,构造方法源码如下:**
```java ```java
/** /**
@ -596,6 +596,8 @@ public class ArrayList<E> extends AbstractList<E>
细心的同学一定会发现 **以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。** 下面在我们分析 ArrayList 扩容时会讲到这一点内容! 细心的同学一定会发现 **以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。** 下面在我们分析 ArrayList 扩容时会讲到这一点内容!
> 补充JDK7 new无参构造的ArrayList对象时直接创建了长度是10的Object[]数组elementData 。jdk7中的ArrayList的对象的创建**类似于单例的饿汉式**而jdk8中的ArrayList的对象的创建**类似于单例的懒汉式**。JDK8的内存优化也值得我们在平时开发中学习。
### 3.2. 一步一步分析 ArrayList 扩容机制 ### 3.2. 一步一步分析 ArrayList 扩容机制
这里以无参构造函数创建的 ArrayList 为例分析 这里以无参构造函数创建的 ArrayList 为例分析
@ -619,7 +621,7 @@ public class ArrayList<E> extends AbstractList<E>
#### 3.2.2. 再来看看 `ensureCapacityInternal()` 方法 #### 3.2.2. 再来看看 `ensureCapacityInternal()` 方法
可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)` JDK7可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)`
```java ```java
//得到最小扩容量 //得到最小扩容量
@ -635,6 +637,8 @@ public class ArrayList<E> extends AbstractList<E>
**当 要 add 进第 1 个元素时minCapacity 为 1在 Math.max()方法比较后minCapacity 为 10。** **当 要 add 进第 1 个元素时minCapacity 为 1在 Math.max()方法比较后minCapacity 为 10。**
> 此处和后续 JDK8 代码格式化略有不同,核心代码基本一样。
#### 3.2.3. `ensureExplicitCapacity()` 方法 #### 3.2.3. `ensureExplicitCapacity()` 方法
如果调用 `ensureCapacityInternal()` 方法就一定会进入(执行)这个方法,下面我们来研究一下这个方法的源码! 如果调用 `ensureCapacityInternal()` 方法就一定会进入(执行)这个方法,下面我们来研究一下这个方法的源码!