mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
Merge pull request #1035 from iloooo/iloooo-patch-1
ArrayList初始化代码JDK版本,说明JDK7和JDK8初始化差异
This commit is contained in:
commit
c3fba3e6ae
@ -541,7 +541,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
### 3.1. 先从 ArrayList 的构造函数说起
|
||||
|
||||
**ArrayList 有三种方式来初始化,构造方法源码如下:**
|
||||
**(JDK8)ArrayList 有三种方式来初始化,构造方法源码如下:**
|
||||
|
||||
```java
|
||||
/**
|
||||
@ -596,6 +596,8 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
细心的同学一定会发现 :**以无参数构造方法创建 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<E> extends AbstractList<E>
|
||||
|
||||
#### 3.2.2. 再来看看 `ensureCapacityInternal()` 方法
|
||||
|
||||
可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)`
|
||||
(JDK7)可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)`
|
||||
|
||||
```java
|
||||
//得到最小扩容量
|
||||
@ -635,6 +637,8 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
**当 要 add 进第 1 个元素时,minCapacity 为 1,在 Math.max()方法比较后,minCapacity 为 10。**
|
||||
|
||||
> 此处和后续 JDK8 代码格式化略有不同,核心代码基本一样。
|
||||
|
||||
#### 3.2.3. `ensureExplicitCapacity()` 方法
|
||||
|
||||
如果调用 `ensureCapacityInternal()` 方法就一定会进入(执行)这个方法,下面我们来研究一下这个方法的源码!
|
||||
|
Loading…
x
Reference in New Issue
Block a user