1. 程式人生 > >Collection類之詳解(二)

Collection類之詳解(二)

Collection類之詳解(二)

六、List集合

1.概述

有序的 collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。

List 介面提供了 4 種對列表元素進行定位(索引)訪問方法。

List 介面提供了特殊的迭代器。

2.特有函式

void add(int index, E element)
          在列表的指定位置插入指定元素(可選操作)。
 E remove(int index)
          移除列表中指定位置的元素(可選操作)。
 E get(int index)
          返回列表中指定位置的元素。
 
E
set(int index, E element)
          用指定元素替換列表中指定位置的元素(可選操作)。

3.案例

List list = new ArrayList();
list.add(111);
list.add(222);
list.add(333);
//list.add(10, "000");                  //java.lang.IndexOutOfBoundsException越界異常
//Object obj = list.remove(1);		//通過索引刪除元素,將被刪除的元素返回
//list.remove(111);			//刪除的時候不會自動裝箱,把111當作索引,產生越界異常

//通過索引遍歷List集合
for(int i = 0;i < list.size(); i++) {
	System.out.println(list.get(i));
}

list.set(1, "444");			//將指定位置的元素修改

注:遍歷時,如果需要使用子類方法,和Collection遍歷一樣需要向下轉型 

4.迭代器ListIterator

(1)概述

系列表迭代器,允許程式設計師按任一方向遍歷列表、迭代期間修改列表,並獲得迭代器在列表中的當前位置。

(2)案例

問題:

List list = new ArrayList();
list.add("a");							
list.add("b");
list.add("world");
list.add("c");
list.add("d");
list.add("e");

Iterator it = list.iterator();					//獲取迭代器
while(it.hasNext()) {						//判斷集合中是否有元素
	String str = (String)it.next();				//向下轉型
        //在遍歷的同時修改集合內元素,產生併發異常ConcurrentModificationException
	if("world".equals(str)) {
		list.add("javaee");
	}
}

解決:

ListIterator lit = list.listIterator();			//獲取迭代器(List集合特有的)
while(lit.hasNext()) {
    String str = (String)lit.next();			//向下轉型
    if("world".equals(str)) {
        //此時同樣產生併發修改ConcurrentModificationException
        //list.add("javaee");						
        lit.add("javaee");
    }
}

(3)常用方法

boolean hasNext()
          以正向遍歷列表時,如果列表迭代器有多個元素,則返回 true(換句話說,如果 next 返回一個元素而不是丟擲異常,則返回 true)。
boolean hasPrevious()
          如果以逆向遍歷列表,列表迭代器有多個元素,則返回 true。
 E next()
          返回列表中的下一個元素。
 E previous()
          返回列表中的前一個元素。

案例:

public static void main(String[] args) {
	List list = new ArrayList();
	list.add("a");									
	list.add("b");
	list.add("c");
	list.add("d");
	list.add("e");
		
	ListIterator lit = list.listIterator();			//獲取迭代器
	while(lit.hasNext()) {
		System.out.print(lit.next()); 			//獲取元素並將指標向後移動
	}
		
	System.out.println("\n-----------------");
		
	while(lit.hasPrevious()) {
		System.out.print(lit.previous()); 		//獲取元素並將指標向前移動
	}
}

/*
abcde
-----------------
edcba
*/

七、Vector類

1.概述

Vector 類可以實現可增長的物件陣列。與陣列一樣,它包含可以使用整數索引進行訪問的元件。但是,Vector 的大小可以根據需要增大或縮小,以適應建立 Vector 後進行新增或移除項的操作。

2.特有方法

 void addElement(E obj)
          將指定的元件新增到此向量的末尾,將其大小增加 1。
E elementAt(int index)
          返回指定索引處的元件。
Enumeration<E> elements()
          返回此向量的元件的列舉。

3.案例

public static void main(String[] args) {
	Vector v = new Vector();
	v.addElement("a");
	v.addElement("b");
	v.addElement("c");
	v.addElement("d");
		
	Enumeration en = v.elements();					//獲取列舉
	while(en.hasMoreElements()) {					//判斷集合中是否有元素
		System.out.println(en.nextElement());		    //獲取集合中的元素
	}
}

注:Vector是JAVA早期版本中的類,目前大多數都使用ArrayList代替。

八、List的三個子類的特點

ArrayList:

底層資料結構是陣列,查詢快,增刪慢。

執行緒不安全,效率高。

Vector:

底層資料結構是陣列,查詢快,增刪慢。

執行緒安全,效率低。

Vector相對ArrayList查詢慢(執行緒安全的)

Vector相對LinkedList增刪慢(陣列結構)

LinkedList:

底層資料結構是連結串列,查詢慢,增刪快。

執行緒不安全,效率高。

Vector和ArrayList的區別:

Vector是執行緒安全的,效率低

ArrayList是執行緒不安全的,效率高

共同點:都是陣列實現的

ArrayList和LinkedList的區別

ArrayList底層是陣列結果,查詢和修改快

LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢

共同點:都是執行緒不安全的