-
集合
-
List、Map、Set的常用函數;
-
將一個ArrayList轉化爲指定類型的數組;
-
遍歷List、Map、Set(3種方法);
-
邊遍歷,邊刪除List、Set的元素;
遍歷集合舉例:
package day4demo; import java.util.*; public class day4demo6 { /** * @param args */ public static void ergodiclist1(List<String> list) { Object[] obj=list.toArray(); for(int i=0;i<obj.length;i++) { System.out.println(obj[i]); } } public static void ergodiclist2(List<String> list) { for(String it:list) { System.out.println(it); } } public static void ergodiclist3(List<String> list) { Iterator<String> it=list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } public static void ergodiclist4(List<String> list) { for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } } public static void ergodiclist5(List<String> list) { for(int i=0;i<list.size();i++){ if(list.get(i).equals("bobge")){ list.remove(i); } } System.out.println(list); } public static void main(String[] args) { // TODO Auto-generated method stub List<String> list=new ArrayList<String>(); list.add("bobge"); list.add("wangchao"); list.add("zhangyan"); ergodiclist1(list); ergodiclist2(list); ergodiclist3(list); ergodiclist4(list); ergodiclist5(list); } }
通過該題來總結一下集合的相關知識:
集合類的說明:
Collection(iterator方法遍歷)
-List (add) //將以特定次序存儲元素。所以取出來的順序可能和放入順序不同。
-LinkedList (get remove insert等方法 )
-ArrayList (size,isEmpty,get,set等方法,時間複雜度都是常數,但是add添加N個元素方法的時間複雜度是O(N))
-Vector
-Stack
-Set //不能有重複值
-HashSet
-TreeSet
Map
-HashMap
-HashTable
-WeakHashMap
List接口:(涉及到堆棧,隊列等操作)
從上面的結構圖可以看出實現List接口的常用類有LinkedList,ArrayList,Vector和Stack.
List除了具有從collection繼承下來的iterator方法外,自身還提供了一個listiterator方法,返回了一個listiterator接口,與collection繼承下來的iterator方法相比,多了一些add()之類的方法,允許添加,刪除和設定元素,還允許向前向後遍歷。
LinkedList(需要快速插入,刪除元素):允許null鍵null值,此外LinkedList還提供額外的get,remove,insert方法。這些方法可以使LinkedList用作堆棧,隊列,或者雙向隊列。(LinkedList沒有同步方法,如果多個線程同時訪問一個LinkedList,則需要在創建list的時候構建一個同步的list)
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList(需要快速隨機訪問元素):允許所有的元素包括null。ArrayList和LinkedList一樣沒有同步方法,它實現了可改變大小的數組(因爲每個ArrayList實例都有一個容量(Capacity),用於存儲數組元素的大小。隨着增加元素而自動增加,但是它沒有定義增加的算法,所以當需要插入大量的數據時可以用ensureCapacity(size+1)方法來增加ArrayList的容量用來提高插入效率。
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
Vector:非常類似於ArrayList,也實現了可變大小的數組。但是Vector是同步的,由它創建的iterator雖然也是繼承了collection接口,但是由於它是同步的,當一個線程改變了Vector的狀態(如刪除或者添加一些元素),這時候iterator方法會拋出ConcurrentModificationException異常,所以使用Vector的iterator方法必須捕獲該異常。
Stack類:繼承自Vector,實現了先進後出的堆棧,提供了基本的POP和PUSH方法,還有peek方法得到棧頂元素,empty檢測棧低是否爲空,search方法搜索元素所在位置。
Set接口:
由結構圖可以知道實現set接口的常用類用hashset和treeset。Set的構造函數有一個很明顯的約束條件就是傳入collection的參數不能包含重複的元素。因此在對Set元素進行操作時要小心,如果出現obj1.equals(obj2)可能會出現問題。
Map接口:
Map接口和set,list接口不同,它不是繼承自collection。它提供key到value的映射,map的內容可以說是一組key集合或者一組value集合或者一組key-value的映射。因爲一個key只能映射到一個value。而一個map不能有相同的key。它提供三種集合的視圖:
注意:儘量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以後需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。如果程序在單線程環境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應該使用同步的類。
-