一:List接口: 繼承自Collection,以下:java
public interface List extends Collection {}
1.ArrayList( 實現類):數組
ArrayList 是一個數組隊列,至關於 動態數組。與Java中的數組相比,它的容量能動態增加。它繼承於AbstractList,實現了List, RandomAccess, Cloneable, java.io.Serializable這些接口。
ArrayList 繼承了AbstractList,實現了List。它是一個數組隊列,提供了相關的添加、刪除、修改、遍歷等功能。
ArrayList 實現了RandmoAccess接口,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,爲List提供快速訪問功能的。在ArrayList中,咱們便可以經過元素的序號快速獲取元素對象;這就是快速隨機訪問。稍後,咱們會比較List的「快速隨機訪問」和「經過Iterator迭代器訪問」的效率。
ArrayList 實現了Cloneable接口,即覆蓋了函數clone(),能被克隆。
ArrayList 實現java.io.Serializable接口,這意味着ArrayList支持序列化,能經過序列化去傳輸,和Vector不一樣,ArrayList中的操做不是線程安全的。因此,建議在單線程中才使用ArrayList,而在多線程中能夠選擇Vector或者CopyOnWriteArrayList。安全
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable {}
1.1ArrayList中的一些基本簡單方法使用:數據結構
public class Test01List { @Test public void testArrayList(){ //使用ArrayList()來存放數據。 List<Person> list = new ArrayList<Person>(); // 父類引用指向子類對象。 list.add( new Person("Berg",22)); list.add( new Person("BergBerg", 21 )); System.out.println(" 總共有" + list.size() +" 個元素 。 "); for( int i=0; i<list.size();i++){ //list可經過索引來訪問, 因此使用get(索引) 來取值。 System.out.println( list.get( i )); } // 迭代list Iterator<Person> iterator = list.iterator(); while( iterator.hasNext() ){ Person p = iterator.next(); System.out.println( "iterator: " + p ); } // 移除元素,按索引移除 list.remove( 0 ); System.out.println(" 移除第一個元素後: "); System.out.println(" 總共有" + list.size() +" 個元素 。 "); for(int i =0 ; i<list.size(); i++){ System.out.println( list.get( i )); } list.add( new Person("Cccc" , 19) ); System.out.println(" 總共有" + list.size() +" 個元素 。 "); Object[] obj = list.toArray(); System.out.println( "\n******將list集合轉化爲數組*****:"); for(int i=0;i<obj.length;i++){ System.out.println( obj[i]); } // 所有清空 。 list.clear(); System.out.println(" 總共有" + list.size() +" 個元素 。 "); } }
1.2 List的「快速隨機訪問」和「經過Iterator迭代器訪問」的效率。( 三種遍歷方式)
多線程
public class Test02ArrayList { public static void main(String[] args) { List list = new ArrayList(); for (int i=0; i<100000; i++) list.add(i); //經過索引值遍歷 iteratorByRandomAccess(list) ; //經過迭代器遍歷 iteratorByIterator(list) ; //經過for循環遍歷 iteratorByForEach(list) ; } public static void iteratorByRandomAccess(List list) { long startTime; long endTime; startTime = System.currentTimeMillis(); for (int i=0; i<list.size(); i++) { list.get(i); } endTime = System.currentTimeMillis(); long interval = endTime - startTime; System.out.println("iteratorByRandomAccess:" + interval+" ms"); } public static void iteratorByIterator(List list) { long startTime; long endTime; startTime = System.currentTimeMillis(); for(Iterator iter = list.iterator(); iter.hasNext(); ) { iter.next(); } endTime = System.currentTimeMillis(); long interval = endTime - startTime; System.out.println("iteratorByIterator:" + interval+" ms"); } public static void iteratorByForEach(List list) { long startTime; long endTime = 0; startTime = System.currentTimeMillis(); for(Object obj:list) endTime = System.currentTimeMillis(); long interval = endTime - startTime; System.out.println("iteratorByForEach:" + interval+" ms"); } }
更多學習之ArrayList詳細介紹(示例): http://www.jb51.net/article/42764.htm
更多學習之ArrayList詳細介紹(示例): http://www.jb51.net/article/42764.htm
2.LinkedList( 實現類):dom
函數LinkedList也和ArrayList同樣實現了List接口,可是它執行插入和刪除操做時比ArrayList更加高效,由於它是基於鏈表的。基於鏈表也決定了它在隨機訪問方面要比ArrayList遜色一點。
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable {}
源碼分析LinkedList是一個繼承於AbstractSequentialList的雙向鏈表。它也能夠被當作堆棧、隊列或雙端隊列進行操做。
性能 LinkedList實現List接口,能對它進行隊列操做。
學習 LinkedList實現Deque接口,即能將LinkedList當作雙端隊列使用。
LinkedList實現了Cloneable接口,即覆蓋了函數clone(),能克隆。
LinkedList實現Serializable接口,這意味着LinkedList支持序列化,能經過序列化去傳輸。
LinkedList是非同步的。
參照API,對LinkedList一些基本方法學習:
public class Test03LinkedList { public static void main(String[] args) { //使用LinkedList()來存放數據。 List<String> list = new LinkedList<String>(); // 父類引用指向子類對象。 list.add("Berg"); list.add("Smith"); list.add("Xujun"); list.add("RedSun"); System.out.println(" 總共有" + list.size() +" 個元素 。 "); //1.首先先迭代遍歷這個集合,並打印輸出當前元素的下標位置。 Iterator<String> iterator = list.iterator(); printResult(list); //2.在此列表中指定的位置插入指定的元素, 而後在迭代輸出。 list.add(2, "China"); printResult(list); //3.分別將某個元素添加到列表的頭部和尾部: ((LinkedList)list).addFirst("firstElement"); ((LinkedList)list).addLast("lastElement"); printResult(list); System.out.println("\n---------------------"); //4.返回此列表中的元素的列表迭代器:list.listIterator() ListIterator<String> listIterator = list.listIterator(); while( listIterator.hasNext() ){ //正向遍歷列表 String string = listIterator.next(); System.out.println( "當前元素爲: " + string ); } while( listIterator.hasPrevious() ){ // 反向遍歷列表 String str = listIterator.previous(); System.out.println( "當前一個對象元素: " + str ); } //5.在當前位置前添加一個元素: // listIterator.add("addNewElement"); // printResult(list); //// //6.用新元素取代next或previous上次訪問的元素。 若是在next或previous上次調用以後列表結構被修改了,將拋出一個IllegalStateException異常。 listIterator.set( "setNewElement"); printResult(list); } private static void printResult(List list){ Iterator<String> iterator = list.iterator(); System.out.println( "\n------------------------"); while( iterator.hasNext() ){ String str = iterator.next(); System.out.println( "當前迭代的元素是: " + str + ", 及當前元素位置即下標值爲: " + list.indexOf(str) ); } System.out.println( "------------------------\n"); } }
更多學習之LinkedList的實現原理:http://tan4836128.iteye.com/blog/1717809。
Java源碼分析之LinkedList:http://blog.csdn.net/jzhf2012/article/details/8540543
LinkedList和ArrayList的使用及性能分析:
http://www.jb51.net/article/42767.htm
( 實現類)3.Vector
:
Vector 是矢量隊列,它是JDK1.0版本添加的類。繼承於AbstractList,實現了List, RandomAccess, Cloneable這些接口。
Vector 繼承了AbstractList,實現了List;因此,它是一個隊列,支持相關的添加、刪除、修改、遍歷等功能。
Vector 實現了RandmoAccess接口,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,爲List提供快速訪問功能的。在Vector中,咱們便可以經過元素的序號快速獲取元素對象;這就是快速隨機訪問。
Vector 實現了Cloneable接口,即實現clone()函數。它能被克隆。
和ArrayList不一樣,Vector中的操做是線程安全的;可是,Vector不支持序列化,即沒有實現java.io.Serializable接口。即:
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
對Vector的一些基本方法的使用,參照API:
public class Test04Vector { public static void main(String[] args) { // 默認初始容量大小爲10 , 這個可參考源碼。 List<String> list = new Vector(1); list.add("Berg"); list.add("china"); // 1. 返回指定索引處的組件。 跟 get(intindex)功能徹底相同 String str = (String) ((Vector)list).elementAt(1); System.out.println("返回的對象值: "+ str ); ((Vector)list).addElement("TheVector"); //2. 返回此向量的組件的枚舉。 Enumeration<String> enumeration = ((Vector)list).elements(); //2.1測試此枚舉是否包含更多的元素。 while( enumeration.hasMoreElements() ){ //2.2 若是此枚舉對象至少還有一個可提供的元素,則返回此枚舉的下一個元素。 String string = enumeration.nextElement(); System.out.println( "枚舉對象值: " + string ); } //3. 返回此向量的當前容量 int size = ((Vector)list).capacity(); System.out.println( "當前容量爲: " + size ); //4.將指定對象做爲此向量中的組件插入到指定的 index 處。 ((Vector)list).insertElementAt("insertNewElement", 2); //5.返回此 List 的部分視圖,元素範圍爲從 fromIndex(包括)到 toIndex(不包括)。 List<String> list1 = ((Vector)list).subList(0, 2); printResult(list1); printResult(list); } private static void printResult(List<String> list ){ Iterator<String> iterator = list.iterator(); System.out.println( "\n------------------------"); System.out.println( "size: " + list.size() ); while( iterator.hasNext() ){ String str = iterator.next(); System.out.println( "當前迭代的元素是: " + str + ", 及當前元素位置即下標值爲: " + list.indexOf(str) ); } System.out.println( "------------------------\n"); } }
Vector源碼解析和實例代碼:http://www.jb51.net/article/42765.htm (t挺好的。。。)
4. 總結:ArrayList, LinkedList,Vector的區別:
4.1 線程安全方面:
Vector是線程安全,ArrayList與LinkedList線程不安全。
4.2 底層數據結構的實現:
LinkedList是雙向鏈表,而ArrayList 與 Vector 是數組。
4.3 存儲性能和特性來說:
ArrayList與Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,他們都容許直接按序號索引元素,可是插入元素要涉及數據元素移動等內存操做,因此索引數據快而插入數據慢。Vector因爲使用了synchronized方法,性能上較ArrayList差,而LinkedList使用雙向鏈表存儲,按序號索引數據須要進行前向或後向遍歷,可是插入數據時值須要記錄本項的先後項便可,因此插入速度較快。