內功心法 -- java.util.ArrayList (1)


寫在前面的話:讀書破萬卷,編碼如有神
--------------------------------------------------------------------
下文主要對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 毫秒
View Code

----------------------------------------------------------------------------------------

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM