From cfe3e73a44480b0ab86d2b079a42320d1b4f11b6 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 10 Aug 2018 07:28:02 +0800 Subject: [PATCH] Update ArrayList.md --- "Java\347\233\270\345\205\263/ArrayList.md" | 46 +++++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git "a/Java\347\233\270\345\205\263/ArrayList.md" "b/Java\347\233\270\345\205\263/ArrayList.md" index e459c477..a46247e9 100644 --- "a/Java\347\233\270\345\205\263/ArrayList.md" +++ "b/Java\347\233\270\345\205\263/ArrayList.md" @@ -1,17 +1,27 @@ -### **目录:** - 0-0-1. 前言 - 0-0-2. 集合框架知识回顾 -0-0-3. ArrayList简介 -0-0-4. ArrayList核心源码 - 0-0-5. ArrayList源码剖析 - 0-0-6. ArrayList经典Demo + + + +- [集合框架知识回顾:](#集合框架知识回顾:) +- [ArrayList简介:](#arraylist简介:) +- [ArrayList核心源码:](#arraylist核心源码:) +- [ArrayList源码分析:](#arraylist源码分析:) + - [System.arraycopy\(\)和Arrays.copyOf\(\)方法](#systemarraycopy和arrayscopyof方法) + - [两者联系与区别:](#两者联系与区别:) + - [ArrayList核心扩容技术](#arraylist核心扩容技术) + - [内部类](#内部类) +- [ArrayList经典Demo:](#arraylist经典demo:) + + + + + -### **前言:** -   这篇文章,其实几天前就已经在图书馆写出来了,不过手一抖几个删除键就都没有了,所以一直拖到了现在。这篇文章在分析ArrayList的时候对ArrayList源码中用到的比较好的语法也会作以陈述。希望通过这篇文章可以让你从本质上认识ArrayList,笔者愚笨,如若遇到错误敬请告知。 -### **集合框架知识回顾:** +### 集合框架知识回顾: **总体知识脉络** + ![集合框架](https://ws1.sinaimg.cn/large/006rNwoDgy1flk1g7h1lzj318a0sjac8.jpg) -### **ArrayList简介:** + +### ArrayList简介:   ArrayList 的底层是数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。它继承于**AbstractList**,实现了**List**, **RandomAccess**, **Cloneable**, **java.io.Serializable**这些接口。   在我们学数据结构的时候就知道了线性表的顺序存储,插入删除元素的时间复杂度为**O(n)**,求表长以及增加元素,取第 i 元素的时间复杂度为**O(1)**   ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。 @@ -19,7 +29,7 @@   ArrayList 实现了**Cloneable接口**,即覆盖了函数clone(),**能被克隆**。   ArrayList 实现**java.io.Serializable接口**,这意味着ArrayList**支持序列化**,**能通过序列化去传输**。   和Vector不同,**ArrayList中的操作不是线程安全的**!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。 -### **ArrayList核心源码:** +### ArrayList核心源码: ```java package java.util; @@ -522,8 +532,8 @@ public class ArrayList extends AbstractList ``` -### **ArrayList源码分析:** -##### **System.arraycopy()和Arrays.copyOf()方法** +### ArrayList源码分析: +#### System.arraycopy()和Arrays.copyOf()方法   通过上面源码我们发现这两个实现数组复制的方法被广泛使用而且很多地方都特别巧妙。比如下面add(int index, E element)方法就很巧妙的用到了arraycopy()方法让数组自己复制自己实现让index开始之后的所有成员后移一个位置: ```java /** @@ -555,13 +565,13 @@ public class ArrayList extends AbstractList return Arrays.copyOf(elementData, size); } ``` -##### **两者联系与区别:** +##### 两者联系与区别: **联系:** 看两者源代码可以发现copyOf()内部调用了System.arraycopy()方法 **区别:** 1,arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里,而且可以选择拷贝的起点和长度以及放入新数组中的位置 2,copyOf()是系统自动在内部新建一个数组,并返回该数组。 -#### **ArrayList核心扩容技术** +#### ArrayList核心扩容技术 ```java //下面是ArrayList的扩容机制 //ArrayList的扩容机制提高了性能,如果每次只扩充一个, @@ -643,7 +653,7 @@ public class ArrayList extends AbstractList 3. .java中的**size()方法**是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看! -#### **内部类** +#### 内部类 ```java (1)private class Itr implements Iterator (2)private class ListItr extends Itr implements ListIterator @@ -651,7 +661,7 @@ public class ArrayList extends AbstractList (4)static final class ArrayListSpliterator implements Spliterator ```   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) -### **ArrayList经典Demo:** +### ArrayList经典Demo: ```java package list; -- GitLab