Skip to content

Commit dab0f57

Browse files
authored
Merge pull request Snailclimb#1 from Snailclimb/master
更新
2 parents 901230a + 073c538 commit dab0f57

39 files changed

+3416
-465
lines changed

Java相关/ArrayList-Grow.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
```
5656

57-
细心的同学一定会发现 :**以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。** 下面在我们分析 ArrayList 扩容时会降到这一点内容
57+
细心的同学一定会发现 :**以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。** 下面在我们分析 ArrayList 扩容时会讲到这一点内容
5858

5959
## 二 一步一步分析 ArrayList 扩容机制
6060

@@ -308,7 +308,7 @@ ArrayList 源码中有一个 `ensureCapacity` 方法不知道大家注意到没
308308

309309
```
310310

311-
**最好在 add 大量元素之前用 `ensureCapacity` 方法,以减少增量从新分配的次数**
311+
**最好在 add 大量元素之前用 `ensureCapacity` 方法,以减少增量重新分配的次数**
312312

313313
我们通过下面的代码实际测试以下这个方法的效果:
314314

@@ -344,4 +344,4 @@ public class EnsureCapacityTest {
344344
345345
```
346346

347-
通过运行结果,我们可以很明显的看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量从新分配的次数
347+
通过运行结果,我们可以很明显的看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量重新分配的次数

Java相关/ArrayList.md

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
<!-- MarkdownTOC -->
32

43
- [ArrayList简介](#arraylist简介)
@@ -19,15 +18,15 @@
1918
它继承于 **AbstractList**,实现了 **List**, **RandomAccess**, **Cloneable**, **java.io.Serializable** 这些接口。
2019

2120
在我们学数据结构的时候就知道了线性表的顺序存储,插入删除元素的时间复杂度为**O(n)**,求表长以及增加元素,取第 i 元素的时间复杂度为**O(1)**
22-
21+
2322
  ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
24-
23+
2524
  ArrayList 实现了**RandomAccess 接口**,即提供了随机访问功能。RandomAccess 是 Java 中用来被 List 实现,为 List 提供**快速访问功能**的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。
26-
25+
2726
  ArrayList 实现了**Cloneable 接口**,即覆盖了函数 clone(),**能被克隆**
28-
27+
2928
  ArrayList 实现**java.io.Serializable 接口**,这意味着ArrayList**支持序列化****能通过序列化去传输**
30-
29+
3130
  和 Vector 不同,**ArrayList 中的操作不是线程安全的**!所以,建议在单线程中才使用 ArrayList,而在多线程中可以选择 Vector 或者 CopyOnWriteArrayList。
3231
### ArrayList核心源码
3332

@@ -85,7 +84,7 @@ public class ArrayList<E> extends AbstractList<E>
8584
}
8685

8786
/**
88-
*默认构造函数,其默认初始容量为10
87+
*默认构造函数,DEFAULTCAPACITY_EMPTY_ELEMENTDATA 为0.初始化为10,也就是说初始其实是空数组 当添加第一个元素的时候数组容量才变成10
8988
*/
9089
public ArrayList() {
9190
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
@@ -177,7 +176,7 @@ public class ArrayList<E> extends AbstractList<E>
177176
newCapacity = minCapacity;
178177
//再检查新容量是否超出了ArrayList所定义的最大容量,
179178
//若超出了,则调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE,
180-
//如果minCapacity大于最大容量,则新容量则为ArrayList定义的最大容量,否则,新容量大小则为 minCapacity。
179+
//如果minCapacity大于MAX_ARRAY_SIZE,则新容量则为Interger.MAX_VALUE,否则,新容量大小则为 MAX_ARRAY_SIZE。
181180
if (newCapacity - MAX_ARRAY_SIZE > 0)
182181
newCapacity = hugeCapacity(minCapacity);
183182
// minCapacity is usually close to size, so this is a win:
@@ -631,7 +630,7 @@ public class ArrayList<E> extends AbstractList<E>
631630
newCapacity = minCapacity;
632631
//再检查新容量是否超出了ArrayList所定义的最大容量,
633632
//若超出了,则调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE,
634-
//如果minCapacity大于最大容量,则新容量则为ArrayList定义的最大容量,否则,新容量大小则为 minCapacity。
633+
//如果minCapacity大于MAX_ARRAY_SIZE,则新容量则为Interger.MAX_VALUE,否则,新容量大小则为 MAX_ARRAY_SIZE。
635634
if (newCapacity - MAX_ARRAY_SIZE > 0)
636635
newCapacity = hugeCapacity(minCapacity);
637636
// minCapacity is usually close to size, so this is a win:
@@ -653,14 +652,14 @@ public class ArrayList<E> extends AbstractList<E>
653652

654653
3. .java 中的**size()方法**是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
655654

656-
655+
657656
#### 内部类
658657
```java
659658
(1)private class Itr implements Iterator<E>
660659
(2)private class ListItr extends Itr implements ListIterator<E>
661660
(3)private class SubList extends AbstractList<E> implements RandomAccess
662661
(4)static final class ArrayListSpliterator<E> implements Spliterator<E>
663-
```
662+
```
664663
  ArrayList有四个内部类,其中的**Itr是实现了Iterator接口**,同时重写了里面的**hasNext()**,**next()**,**remove()**等方法;其中的**ListItr**继承**Itr**,实现了**ListIterator接口**,同时重写了**hasPrevious()**,**nextIndex()**,**previousIndex()**,**previous()**,**set(E e)**,**add(E e)**等方法,所以这也可以看出了**Iterator和ListIterator的区别:**ListIterator在Iterator的基础上增加了添加对象,修改对象,逆向遍历等方法,这些是Iterator不能实现的。
665664
### <font face="楷体" id="6"> ArrayList经典Demo</font>
666665

0 commit comments

Comments
 (0)