mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[docs update]typo
This commit is contained in:
parent
0ac9baa344
commit
d2bb3052df
@ -103,18 +103,22 @@ star: 2
|
||||
|
||||
## 如何加入?
|
||||
|
||||
两年前,星球的定价是 **50/年** ,这是星球的最低定价,我还附送了 33 元优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。感兴趣的小伙伴可以看看我在 2020-01-03 发的头条:[做了一个很久没敢做的事情](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486049&idx=1&sn=e0161b409e8f164251bdaa0c83a476bc&chksm=cea245aaf9d5ccbcafdb95a546d959508814085620aabdbb4385c4b8cea6e50bf157c3697041&token=1614894361&lang=zh_CN#rd),去考古一下。
|
||||
两年前,星球的定价是 **50/年** ,这是星球的最低定价,我还附送了 33 元优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。
|
||||
|
||||
随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,星球的定价慢慢被调整为了 **159/年** (**续费半价**)!
|
||||
感兴趣的小伙伴可以看看我在 2020-01-03 发的头条:[做了一个很久没敢做的事情](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486049&idx=1&sn=e0161b409e8f164251bdaa0c83a476bc&chksm=cea245aaf9d5ccbcafdb95a546d959508814085620aabdbb4385c4b8cea6e50bf157c3697041&token=1614894361&lang=zh_CN#rd),去考古一下。
|
||||
|
||||
目前已经有 **1.3w+** 人加入星球,随着加入的人数增加,这个定价还会继续调整,越早加入越划算!
|
||||

|
||||
|
||||
为了感谢大家的支持,我这里再送出一张新人优惠券,使用优惠券 **139/年** 加入(数量有限,即将调整为 **199/年**)。
|
||||
随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **159/年**!后续会将星球的价格调整为 **199/年**,想要加入的小伙伴一定要尽早。
|
||||
|
||||
你可以添加我的微信(没有手机号再申请微信,故使用企业微信。不过,请放心,这个号的消息也是我本人处理,平时最常看这个微信)领取星球专属优惠券,限时 **130/年** 加入(续费半价)!
|
||||
|
||||

|
||||
|
||||
或者你也可以直接使用下面这张 **20** 元的优惠券,**139/年** 加入。
|
||||
|
||||

|
||||
|
||||
如果你在犹豫要不要加入的话,我建议你进来体验一下,三天之内知识星球 APP 右上角可以申请全额退款,秒到账!绝对不会坑大家!
|
||||
|
||||
进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)。待你完成目标在星球分享之后,我会将星球的门票费退还给你。
|
||||
|
||||
**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 缓存基础常见面试题总结
|
||||
title: 缓存基础常见面试题总结(付费)
|
||||
category: 数据库
|
||||
tag:
|
||||
- Redis
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Redis 集群详解
|
||||
title: Redis 集群详解(付费)
|
||||
category: 数据库
|
||||
tag:
|
||||
- Redis
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 分布式事务
|
||||
title: 分布式事务(付费)
|
||||
category: 分布式
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 降级&熔断
|
||||
title: 降级&熔断(付费)
|
||||
category: 高可用
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 优质面经
|
||||
title: 优质面经(付费)
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 常见面试题自测
|
||||
title: 常见面试题自测(付费)
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 手把手教你如何准备面试
|
||||
title: 手把手教你如何准备面试(付费)
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
|
@ -6,7 +6,7 @@ tag:
|
||||
---
|
||||
|
||||
|
||||
## 1. ArrayList 简介
|
||||
## ArrayList 简介
|
||||
|
||||
`ArrayList` 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用`ensureCapacity`操作来增加 `ArrayList` 实例的容量。这可以减少递增式再分配的数量。
|
||||
|
||||
@ -24,12 +24,12 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
- `ArrayList` 实现了 **`Cloneable` 接口** ,即覆盖了函数`clone()`,能被克隆。
|
||||
- `ArrayList` 实现了 `java.io.Serializable`接口,这意味着`ArrayList`支持序列化,能通过序列化去传输。
|
||||
|
||||
### 1.1. Arraylist 和 Vector 的区别?
|
||||
### Arraylist 和 Vector 的区别?
|
||||
|
||||
1. `ArrayList` 是 `List` 的主要实现类,底层使用 `Object[ ]`存储,适用于频繁的查找工作,线程不安全 ;
|
||||
2. `Vector` 是 `List` 的古老实现类,底层使用 `Object[ ]`存储,线程安全的。
|
||||
|
||||
### 1.2. Arraylist 与 LinkedList 区别?
|
||||
### Arraylist 与 LinkedList 区别?
|
||||
|
||||
1. **是否保证线程安全:** `ArrayList` 和 `LinkedList` 都是不同步的,也就是不保证线程安全;
|
||||
2. **底层数据结构:** `Arraylist` 底层使用的是 **`Object` 数组**;`LinkedList` 底层使用的是 **双向链表** 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!)
|
||||
@ -37,7 +37,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
4. **是否支持快速随机访问:** `LinkedList` 不支持高效的随机元素访问,而 `ArrayList` 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于`get(int index)`方法)。
|
||||
5. **内存空间占用:** `ArrayList` 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 `LinkedList` 的空间花费则体现在它的每一个元素都需要消耗比 `ArrayList` 更多的空间(因为要存放直接后继和直接前驱以及数据)。
|
||||
|
||||
## 2. ArrayList 核心源码解读
|
||||
## ArrayList 核心源码解读
|
||||
|
||||
```java
|
||||
package java.util;
|
||||
@ -546,9 +546,9 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
```
|
||||
|
||||
## 3. ArrayList 扩容机制分析
|
||||
## ArrayList 扩容机制分析
|
||||
|
||||
### 3.1. 先从 ArrayList 的构造函数说起
|
||||
### 先从 ArrayList 的构造函数说起
|
||||
|
||||
**(JDK8)ArrayList 有三种方式来初始化,构造方法源码如下:**
|
||||
|
||||
@ -603,15 +603,15 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
```
|
||||
|
||||
细心的同学一定会发现 :**以无参数构造方法创建 `ArrayList` 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。** 下面在我们分析 ArrayList 扩容时会讲到这一点内容!
|
||||
细心的同学一定会发现 :**以无参数构造方法创建 ``ArrayList`` 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。** 下面在我们分析 ArrayList 扩容时会讲到这一点内容!
|
||||
|
||||
> 补充:JDK6 new 无参构造的 `ArrayList` 对象时,直接创建了长度是 10 的 `Object[]` 数组 elementData 。
|
||||
|
||||
### 3.2. 一步一步分析 ArrayList 扩容机制
|
||||
### 一步一步分析 ArrayList 扩容机制
|
||||
|
||||
这里以无参构造函数创建的 ArrayList 为例分析
|
||||
|
||||
#### 3.2.1. 先来看 `add` 方法
|
||||
#### 先来看 `add` 方法
|
||||
|
||||
```java
|
||||
/**
|
||||
@ -628,7 +628,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
> **注意** :JDK11 移除了 `ensureCapacityInternal()` 和 `ensureExplicitCapacity()` 方法
|
||||
|
||||
#### 3.2.2. 再来看看 `ensureCapacityInternal()` 方法
|
||||
#### 再来看看 `ensureCapacityInternal()` 方法
|
||||
|
||||
(JDK7)可以看到 `add` 方法 首先调用了`ensureCapacityInternal(size + 1)`
|
||||
|
||||
@ -648,7 +648,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
> 此处和后续 JDK8 代码格式化略有不同,核心代码基本一样。
|
||||
|
||||
#### 3.2.3. `ensureExplicitCapacity()` 方法
|
||||
#### `ensureExplicitCapacity()` 方法
|
||||
|
||||
如果调用 `ensureCapacityInternal()` 方法就一定会进入(执行)这个方法,下面我们来研究一下这个方法的源码!
|
||||
|
||||
@ -673,7 +673,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
|
||||
直到添加第 11 个元素,minCapacity(为 11)比 elementData.length(为 10)要大。进入 grow 方法进行扩容。
|
||||
|
||||
#### 3.2.4. `grow()` 方法
|
||||
#### `grow()` 方法
|
||||
|
||||
```java
|
||||
/**
|
||||
@ -718,7 +718,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
- java 中的 `length()` 方法是针对字符串说的,如果想看这个字符串的长度则用到 `length()` 这个方法.
|
||||
- java 中的 `size()` 方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
|
||||
|
||||
#### 3.2.5. `hugeCapacity()` 方法。
|
||||
#### `hugeCapacity()` 方法。
|
||||
|
||||
从上面 `grow()` 方法源码我们知道: 如果新容量大于 MAX_ARRAY_SIZE,进入(执行) `hugeCapacity()` 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,如果 minCapacity 大于最大容量,则新容量则为`Integer.MAX_VALUE`,否则,新容量大小则为 MAX_ARRAY_SIZE 即为 `Integer.MAX_VALUE - 8`。
|
||||
|
||||
@ -736,11 +736,11 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3. `System.arraycopy()` 和 `Arrays.copyOf()`方法
|
||||
### `System.arraycopy()` 和 `Arrays.copyOf()`方法
|
||||
|
||||
阅读源码的话,我们就会发现 ArrayList 中大量调用了这两个方法。比如:我们上面讲的扩容操作以及`add(int index, E element)`、`toArray()` 等方法中都用到了该方法!
|
||||
|
||||
#### 3.3.1. `System.arraycopy()` 方法
|
||||
#### `System.arraycopy()` 方法
|
||||
|
||||
源码:
|
||||
|
||||
@ -807,7 +807,7 @@ public class ArraycopyTest {
|
||||
0 1 99 2 3 0 0 0 0 0
|
||||
```
|
||||
|
||||
#### 3.3.2. `Arrays.copyOf()`方法
|
||||
#### `Arrays.copyOf()`方法
|
||||
|
||||
源码:
|
||||
|
||||
@ -856,7 +856,7 @@ public class ArrayscopyOfTest {
|
||||
10
|
||||
```
|
||||
|
||||
#### 3.3.3. 两者联系和区别
|
||||
#### 两者联系和区别
|
||||
|
||||
**联系:**
|
||||
|
||||
@ -866,9 +866,9 @@ public class ArrayscopyOfTest {
|
||||
|
||||
`arraycopy()` 需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置 `copyOf()` 是系统自动在内部新建一个数组,并返回该数组。
|
||||
|
||||
### 3.4. `ensureCapacity`方法
|
||||
### `ensureCapacity`方法
|
||||
|
||||
ArrayList 源码中有一个 `ensureCapacity` 方法不知道大家注意到没有,这个方法 ArrayList 内部没有被调用过,所以很显然是提供给用户调用的,那么这个方法有什么作用呢?
|
||||
`ArrayList` 源码中有一个 `ensureCapacity` 方法不知道大家注意到没有,这个方法 `ArrayList` 内部没有被调用过,所以很显然是提供给用户调用的,那么这个方法有什么作用呢?
|
||||
|
||||
```java
|
||||
/**
|
||||
@ -891,7 +891,7 @@ ArrayList 源码中有一个 `ensureCapacity` 方法不知道大家注意到没
|
||||
|
||||
```
|
||||
|
||||
**最好在 add 大量元素之前用 `ensureCapacity` 方法,以减少增量重新分配的次数**
|
||||
理论上来说,最好在向 `ArrayList` 添加大量元素之前用 `ensureCapacity` 方法,以减少增量重新分配的次数
|
||||
|
||||
我们通过下面的代码实际测试以下这个方法的效果:
|
||||
|
||||
@ -939,4 +939,7 @@ public class EnsureCapacityTest {
|
||||
使用ensureCapacity方法后:1773
|
||||
```
|
||||
|
||||
通过运行结果,我们可以看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量重新分配的次数。
|
||||
通过运行结果,我们可以看出向 `ArrayList` 添加大量元素之前使用`ensureCapacity` 方法可以提升性能。不过,这个性能差距几乎可以忽略不计。而且,实际项目根本也不可能往 `ArrayList` 里面添加这么多元素。
|
||||
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Netty常见面试题总结
|
||||
title: Netty常见面试题总结(付费)
|
||||
category: 框架
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: SpringBoot常见面试题总结
|
||||
title: SpringBoot常见面试题总结(付费)
|
||||
category: 框架
|
||||
tag:
|
||||
- Spring
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 系统设计常见面试题总结
|
||||
title: 系统设计常见面试题总结(付费)
|
||||
category: Java面试指北
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 《手写 RPC 框架》
|
||||
title: 《手写 RPC 框架》(付费)
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
@ -39,6 +39,10 @@ category: 知识星球
|
||||
|
||||

|
||||
|
||||
或者你也可以直接使用下面这张 **20** 元的优惠券,**139/年** 加入。
|
||||
|
||||

|
||||
|
||||
进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)。待你完成目标在星球分享之后,我会将星球的门票费退还给你。
|
||||
|
||||
**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 《Java 面试指北》
|
||||
title: 《Java 面试指北》(付费)
|
||||
category: 知识星球
|
||||
star: 5
|
||||
---
|
||||
@ -88,6 +88,10 @@ star: 5
|
||||
|
||||

|
||||
|
||||
或者你也可以直接使用下面这张 **20** 元的优惠券,**139/年** 加入。
|
||||
|
||||

|
||||
|
||||
进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)。待你完成目标在星球分享之后,我会将星球的门票费退还给你。
|
||||
|
||||
**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**
|
||||
|
@ -38,6 +38,10 @@ category: 知识星球
|
||||
|
||||

|
||||
|
||||
或者你也可以直接使用下面这张 **20** 元的优惠券,**139/年** 加入。
|
||||
|
||||

|
||||
|
||||
进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)。待你完成目标在星球分享之后,我会将星球的门票费退还给你。
|
||||
|
||||
**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 《Java 必读源码系列》
|
||||
title: 《Java 必读源码系列》(付费)
|
||||
category: 知识星球
|
||||
star: true
|
||||
---
|
||||
@ -46,6 +46,10 @@ star: true
|
||||
|
||||

|
||||
|
||||
或者你也可以直接使用下面这张 **20** 元的优惠券,**139/年** 加入。
|
||||
|
||||

|
||||
|
||||
进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)。待你完成目标在星球分享之后,我会将星球的门票费退还给你。
|
||||
|
||||
**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**
|
||||
|
Loading…
x
Reference in New Issue
Block a user