Update ArrayList.md

This commit is contained in:
Snailclimb 2018-08-10 07:28:02 +08:00 committed by GitHub
parent 6126a96815
commit cfe3e73a44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 28 additions and 18 deletions

View File

@ -1,17 +1,27 @@
### <font face="楷体"> **目录:**</font>
<a href="#1" target="_self"> 0-0-1. 前言</a>
<a href="#2" target="_self"> 0-0-2. 集合框架知识回顾</a>
<a href="#3" target="_self">0-0-3. ArrayList简介</a>
<a href="#4" target="_self">0-0-4. ArrayList核心源码</a>
<a href="#5" target="_self"> 0-0-5. ArrayList源码剖析</a>
<a href="#6" target="_self"> 0-0-6. ArrayList经典Demo</a>
<!-- MarkdownTOC -->
- [集合框架知识回顾:](#集合框架知识回顾:)
- [ArrayList简介](#arraylist简介)
- [ArrayList核心源码](#arraylist核心源码)
- [ArrayList源码分析](#arraylist源码分析)
- [System.arraycopy\(\)和Arrays.copyOf\(\)方法](#systemarraycopy和arrayscopyof方法)
- [两者联系与区别:](#两者联系与区别:)
- [ArrayList核心扩容技术](#arraylist核心扩容技术)
- [内部类](#内部类)
- [ArrayList经典Demo](#arraylist经典demo)
<!-- /MarkdownTOC -->
### <font face="楷体" id="1"> **前言:**</font>
  这篇文章其实几天前就已经在图书馆写出来了不过手一抖几个删除键就都没有了所以一直拖到了现在。这篇文章在分析ArrayList的时候对ArrayList源码中用到的比较好的语法也会作以陈述。希望通过这篇文章可以让你从本质上认识ArrayList笔者愚笨如若遇到错误敬请告知。
### <font face="楷体" id="2"> **集合框架知识回顾:**</font>
### <font face="楷体" id="2"> 集合框架知识回顾:</font>
**总体知识脉络**
![集合框架](https://ws1.sinaimg.cn/large/006rNwoDgy1flk1g7h1lzj318a0sjac8.jpg)
### <font face="楷体" id="3"> **ArrayList简介**</font>
### <font face="楷体" id="3"> ArrayList简介</font>
  ArrayList 的底层是数组队列,相当于<font color="red">动态数组</font>。与Java中的数组相比它的容量能动态增长。在添加大量元素前应用程序可以使用<font color="red">ensureCapacity </font>操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。它继承于**AbstractList**,实现了**List**, **RandomAccess**, **Cloneable**, **java.io.Serializable**这些接口。
  在我们学数据结构的时候就知道了线性表的顺序存储,插入删除元素的时间复杂度为**On**,求表长以及增加元素,取第 i 元素的时间复杂度为**O1**
  ArrayList 继承了AbstractList实现了List。它是一个数组队列提供了相关的添加、删除、修改、遍历等功能。
@ -19,7 +29,7 @@
  ArrayList 实现了**Cloneable接口**即覆盖了函数clone()**能被克隆**。
  ArrayList 实现**java.io.Serializable接口**这意味着ArrayList**支持序列化****能通过序列化去传输**。
  和Vector不同**ArrayList中的操作不是线程安全的**所以建议在单线程中才使用ArrayList而在多线程中可以选择Vector或者CopyOnWriteArrayList。
### <font face="楷体" id="4"> **ArrayList核心源码**</font>
### <font face="楷体" id="4"> ArrayList核心源码</font>
```java
package java.util;
@ -522,8 +532,8 @@ public class ArrayList<E> extends AbstractList<E>
```
### <font face="楷体" id="1" id="5"> **ArrayList源码分析**</font>
##### **System.arraycopy()和Arrays.copyOf()方法**
### <font face="楷体" id="1" id="5"> ArrayList源码分析</font>
#### System.arraycopy()和Arrays.copyOf()方法
  通过上面源码我们发现这两个实现数组复制的方法被广泛使用而且很多地方都特别巧妙。比如下面<font color="red">add(int index, E element)</font>方法就很巧妙的用到了<font color="red">arraycopy()方法</font>让数组自己复制自己实现让index开始之后的所有成员后移一个位置:
```java
/**
@ -555,13 +565,13 @@ public class ArrayList<E> extends AbstractList<E>
return Arrays.copyOf(elementData, size);
}
```
##### **两者联系与区别:**
##### 两者联系与区别:
**联系:**
看两者源代码可以发现<font color="red">copyOf()</font>内部调用了<font color="red">System.arraycopy()</font>方法
**区别:**
1<font color="red">arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里</font>,而且可以选择拷贝的起点和长度以及放入新数组中的位置
2<font color="red">copyOf()是系统自动在内部新建一个数组,并返回该数组。</font>
#### **ArrayList核心扩容技术**
#### ArrayList核心扩容技术
```java
//下面是ArrayList的扩容机制
//ArrayList的扩容机制提高了性能如果每次只扩充一个
@ -643,7 +653,7 @@ public class ArrayList<E> extends AbstractList<E>
3. .java中的**size()方法**是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
#### **内部类**
#### 内部类
```java
(1)private class Itr implements Iterator<E>
(2)private class ListItr extends Itr implements ListIterator<E>
@ -651,7 +661,7 @@ public class ArrayList<E> extends AbstractList<E>
(4)static final class ArrayListSpliterator<E> implements Spliterator<E>
```
  ArrayList有四个内部类其中的**Itr是实现了Iterator接口**,同时重写了里面的**hasNext()****next()****remove()**等方法;其中的**ListItr**继承**Itr**,实现了**ListIterator接口**,同时重写了**hasPrevious()****nextIndex()****previousIndex()****previous()****set(E e)****add(E e)**等方法,所以这也可以看出了**Iterator和ListIterator的区别:**ListIterator在Iterator的基础上增加了添加对象修改对象逆向遍历等方法这些是Iterator不能实现的。具体可以参考http://blog.csdn.net/a597926661/article/details/7679765。其中的**SubList继承AbstractList实现了RandmAccess接口**类内部实现了对子序列的增删改查等方法但它同时也充分利用了内部类的优点就是共享ArrayList的全局变量例如检查器变量modCount数组elementData等所以SubList进行的增删改查操作都是对ArrayList的数组进行的并没有创建新的数组。(内部类这里参考了这位老兄的博客http://blog.csdn.net/ljcitworld/article/details/52041836)
### <font face="楷体" id="6"> **ArrayList经典Demo**</font>
### <font face="楷体" id="6"> ArrayList经典Demo</font>
```java
package list;