寫在前面的話:讀書破萬卷,編碼如有神
--------------------------------------------------------------------
下文主要對java.util.ArrayList<E>進行整體性介紹,主要內容包括:
1、 ArrayList概述
2、 ArrayList中的屬性、構造方法、常用方法介紹
3、 ArrayList遍歷
參考內容:
1、JDK源碼(1.7)
--------------------------------------------------------------------
1. ArrayList概述
java.util.ArrayList<E>是一個什么玩意,它有什么功能,我們拿ArrayList能夠干嘛?
簡單點說:java.util.ArrayList<E>是一個列表類,它是用來存放其他Java對象,內部是通過數組來實現的。
先看下面的圖(簡略圖):

(1)java.util.ArrayList<E> 是一個列表,用來存放其它java對象的,只要是java對象就可以往ArrayList里面放
(2)java.util.ArrayList<E>內部是通過數組來實現的:
當數組容量不夠的時候,會對數組容量進行擴容
可以通過數組下標來快速的訪問ArrayList里面的元素
當新增或者刪除ArrayList里面的元素時,可能會涉及到移位操作
可以截取數組的子數組操作
java.util.ArrayList<E>的定義如下:
1 public class ArrayList<E> extends AbstractList<E> 2 implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ 3 //fields 4 5 //constructor 6 7 //methods 8 9 //inner class 'Itr' 10 11 //inner class 'ListItr' 12 13 //inner class 'SubList' 14 }
從ArrayList類的定義中可以看到,它好復雜喲,定義了那么多的東西,又有父類,又實現了接口等等,這都要怪它的'祖宗',定義了那么多的規范、規則。(@_@)
好了,不多廢話,擼起袖子繼續干:
下面來看看一副圖:

2. ArrayList中的屬性、構造方法、常用方法介紹
先來對java.util.ArrayList<E>的描述進行一些約定:
下面文中的:
'列表'代表ArrayList內部的Object[] elementData數組
'列表大小'代表ArrayList內部的Object[] elementData數組的長度
'元素'代表往ArrayList中添加的Java對象
2.1 java.util.ArrayList<E>的常見屬性
1 //序列號 2 private static final long serialVersionUID = 8683452581122892189L; 3 //ArrayList實際存儲元素的地方 4 private transient Object[] elementData; 5 //ArrayList中存儲的元素個數 6 private int size; 7 //ArrayList最多存儲元素的個數 8 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 9 //fast-fail失敗機制標記 10 protected transient int modCount = 0;
2.2 java.util.ArrayList<E>的構造方法
第一種:默認構造方法(無參數構造方法)
1 public ArrayList()
第二種: 帶初始列表容量大小參數的構造方法
1 public ArrayList(int initialCapacity)
第三種:帶初始化子列表參數的構造方法
1 public ArrayList(Collection<? extends E> c)
2.3 java.util.ArrayList<E>的常用方法
| 修改操作 | boolean add(E e) | 將指定的元素添加到此列表的尾部 |
| void add(int index,E element) | 將指定的元素插入此列表中的指定位置 | |
| E remove(int index) | 移除此列表中指定位置上的元素 | |
| boolean remove(Object o) | 移除此列表中首次出現的指定元素 | |
| E set(int index,E element) | 用指定的元素替代此列表中指定位置上的元素 | |
| 批量操作 | boolean addAll(Collection<? extends E> c) | 將子集合c中的元素添加到此集合中 |
| boolean addAll(int index,Collection<? extends E> c) | 將子集合c中的元素添加到此集合中的index位置開始處 | |
| void clear() | 清空此集合 | |
| protected void removeRange(int fromIndex,int toIndex) | 移除集合中索引在fromIndex(包括)和toIndex(不包括)之間的所有元素 | |
| public boolean removeAll(Collection<?> c) | 移除此collection中那些也包含在指定collection中的所有元素 | |
| public boolean retainAll(Collection<?> c) | 僅保留在子集合c中那些也包含在此集合中的元素 | |
| 查詢操作 | boolean contains(Object o) | 判斷集合中是否包含了元素o |
| E get(int index) | 返回此集合中index位置上的元素 | |
| int indexOf(Object o) | 返回此集合中首次出現元素o的位置 | |
| boolean isEmpty() | 判斷此集合是否為空 | |
| int lastIndexOf(Object o) | 返回此集合中最后一次出現元素o的位置 | |
| int size() | 返回此集合中元素的個數 | |
| 其他操作 | Object clone() | 返回此列表實例的淺復制 |
| void ensureCapaCity(int minCapacity) | 如有必要,增加此列表實例的容量,以確保它至少能夠容納最小容量參數所指定的元素數 | |
| void trimToSize() | 將此列表實例的容量調整為列表的當前大小 | |
| 數組操作 | Object[] toArray() | 按適當順序返回包含此列表中所有元素的數組 |
| <T> T[] toArray(T[] a) | 按適當順序返回包含此列表中所有元素的數組 | |
| Iterator和子List操作 | ListIterator<E> listIterator(int index) | 返回列表的ListIterator實例 |
| ListIterator<E> listIterator() | 返回列表的ListIterator實例 | |
| Iterator<E> iterator() | 返回列表的Iterator實例 | |
| List<E> subList(int fromIndex, int toIndex) | 返回列表的子列表 |
----------------------------------------------------------------------------------------
3. ArrayList遍歷方法
java.util.ArrayList<E>支持三種遍歷方式:
第一種: 通過索引值去遍歷(隨機遍歷)
第三種: 通過增強的for循環去遍歷
第三種: 通過迭代器去遍歷
下面就來看看三種遍歷方式的示例代碼和遍歷的效率比較:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 6 public class ArrayListAccessDemo { 7 /** 8 * 通過索引值去遍歷(隨機訪問) 9 */ 10 public static void accessByIndex(List<Integer> list){ 11 long beginTime = System.currentTimeMillis(); 12 for(int i = 0;i < list.size();i++){ 13 list.get(i); 14 } 15 long endTime = System.currentTimeMillis(); 16 long totalTime = endTime - beginTime; 17 System.out.println("通過索引值去遍歷(隨機訪問) 花費的時間:" + totalTime+" 毫秒"); 18 19 } 20 21 /** 22 * 通過增強的for循環去遍歷 23 */ 24 public static void accessByFor(List<Integer> list){ 25 long beginTime = System.currentTimeMillis(); 26 for(Integer i : list){ 27 list.get(i); 28 } 29 long endTime = System.currentTimeMillis(); 30 long totalTime = endTime - beginTime; 31 System.out.println("通過增強的for循環去遍歷 花費的時間:" + totalTime+" 毫秒"); 32 33 } 34 35 /** 36 * 通過Iterator迭代器去遍歷 37 */ 38 public static void accessByIterator(List<Integer> list){ 39 long beginTime = System.currentTimeMillis(); 40 Iterator<Integer> it = list.iterator(); 41 while(it.hasNext()){ 42 it.next(); 43 } 44 long endTime = System.currentTimeMillis(); 45 long totalTime = endTime - beginTime; 46 System.out.println("通過Iterator迭代器去遍歷 花費的時間:" + totalTime+" 毫秒"); 47 48 } 49 50 public static void main(String[] args) { 51 //創建一個ArrayList實例 52 List<Integer> list = new ArrayList<Integer>(); 53 //往ArrayList實例中添加數據 54 for(int i = 0;i < 10000000;i++){ 55 list.add(i); 56 } 57 58 accessByIndex(list); 59 accessByFor(list); 60 accessByIterator(list); 61 } 62 } 63 64 運行結果: 65 ArrayList中有100W條數據時: 66 通過索引值去遍歷(隨機訪問) 花費的時間:2 毫秒 67 通過增強的for循環去遍歷 花費的時間:9 毫秒 68 通過Iterator迭代器去遍歷 花費的時間:4 毫秒 69 70 ArrayList中有500W條數據時: 71 通過索引值去遍歷(隨機訪問) 花費的時間:4 毫秒 72 通過增強的for循環去遍歷 花費的時間:20 毫秒 73 通過Iterator迭代器去遍歷 花費的時間:9 毫秒 74 75 ArrayList中有1000W條數據時: 76 通過索引值去遍歷(隨機訪問) 花費的時間:3 毫秒 77 通過增強的for循環去遍歷 花費的時間:32 毫秒 78 通過Iterator迭代器去遍歷 花費的時間:13 毫秒 79 80 ArrayList中有5000W條數據時: 81 通過索引值去遍歷(隨機訪問) 花費的時間:3 毫秒 82 通過增強的for循環去遍歷 花費的時間:118 毫秒 83 通過Iterator迭代器去遍歷 花費的時間:55 毫秒
----------------------------------------------------------------------------------------
java.util.ArrayList系列文章
java.util.ArrayList<E>(1) java.util.ArrayList<E>(2) java.util.ArrayList<E>(3)
java.util.ArrayList<E>(4) java.util.ArrayList<E>(5) java.util.ArrayList<E>(6)
相關知識
java.util.Collection<E> java.util.AbstractCollection<E> java.util.List<E>
java.util.AbstractList<E> java.util.Iterator<E> java.util.ListIterator<E>
Java中的標記接口 迭代器模式 Java中的深拷貝和淺拷貝 java.util.Arrays
