Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

1.5. Collection

		
Collection
 ├List
 │├LinkedList
 │├ArrayList
 │└Vector
 │ └Stack
 └Set
		
	
		
Collection介面
  Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些 Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子介面”如List和Set。
  所有實現Collection介面的類都必須提供兩個標準的建構子:無參數的建構子用於創建一個空的Collection,有一個 Collection參數的建構子用於創建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。後 一個建構子允許用戶複製一個Collection。
  如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:
    Iterator it = collection.iterator(); // 獲得一個迭代子
    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一個元素
    }
  由Collection介面派生的兩個介面是List和Set。
List介面
  List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似於數組下標)來訪問List中的元素,這類似於Java的數組。
和下面要提到的Set不同,List允許有相同的元素。
  除了具有Collection介面必備的iterator()方法外,List還提供一個listIterator()方法,返回一個 ListIterator介面,和標準的Iterator介面相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素, 還能向前或向後遍歷。
  實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。
LinkedList類
  LinkedList實現了List介面,允許null元素。此外LinkedList提供額外的get,remove,insert方法在 LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
  注意LinkedList沒有同步方法。如果多個綫程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:
    List list = Collections.synchronizedList(new LinkedList(...));
ArrayList類
  ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。
size,isEmpty,get,set方法運行時間為常數。但是add方法開銷為分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間為線性。
  每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增加,但是增長算法 並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
  和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。
Vector類
  Vector非常類似ArrayList,但是Vector是同步的。由Vector創建的Iterator,雖然和 ArrayList創建的Iterator是同一介面,但是,因為Vector是同步的,當一個Iterator被創建而且正在被使用,另一個綫程改變了 Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出 ConcurrentModificationException,因此必須捕獲該異常。
Stack 類
  Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop 方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創建後是空棧。
Set介面
  Set是一種不包含重複的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。
  很明顯,Set的建構子有一個約束條件,傳入的Collection參數不能包含重複的元素。
  請注意:必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。
Map介面
  請注意,Map沒有繼承Collection介面,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個 value。Map介面提供3種集合的視圖,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value映射。		
		
	
		
package cn.netkiller.example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.TreeSet;

public class Test {

	public Test() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// A A B E F G C D
		String[] array = { "A", "A", "B", "E", "F", "G", "C", "D" };
		Collection<String> list = new ArrayList<String>(Arrays.asList(array));
		for (String str : list) {
			System.out.print(str + " ");
		}
		System.out.println();

		// A A B E F G C D
		Collection<String> linkedList = new LinkedList<String>(Arrays.asList(array));
		for (String str : linkedList) {
			System.out.print(str + " ");
		}
		System.out.println();

		// 無重複,無序 D E F G A B C
		Collection<String> hashSet = new HashSet<String>(Arrays.asList(array));
		for (String str : hashSet) {
			System.out.print(str + " ");
		}
		System.out.println();

		// 無重複 A B C D E F G
		Collection<String> treeSet = new TreeSet<String>(Arrays.asList(array));
		for (String str : treeSet) {
			System.out.print(str + " ");
		}
		System.out.println();

		// 無重複 A B E F G C D
		Collection<String> linkedHashSet = new LinkedHashSet<String>(Arrays.asList(array));
		for (String str : linkedHashSet) {
			System.out.print(str + " ");

		}

	}

}
		
	

輸出結果

		A A B E F G C D
		A A B E F G C D
		A B C D E F G
		A B C D E F G
		A B E F G C D
	

1.5.1. 靜態 List

			
	public static List<String> list = new ArrayList<String>();
	static {
		list.add("錄入");
		list.add("變更");
		list.add("收藏");
		list.add("在售");
		list.add("展出");
	}			
				
			
		

1.5.2. ArrayList

判斷元素是否存在

		
import java.util.ArrayList;

public class arraylist {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<String> whitelist = new ArrayList<String>();
		whitelist.add("Neo");
		whitelist.add("Jam");
		whitelist.add("Sam");

		if (whitelist.contains("Neo")) {
			System.out.println("Found!");
		}else{
			System.out.println("Not Found!");
		}
	}

}
		
		
		
package cn.netkiller.type;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> list = new ArrayList<String>();
		list.add("Jack");
		list.add("Jet");
		list.add("Jack");
		list.add("Mike");
		list.add("Kitty");
		list.add("Tom");
		
		//while 循環
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}

		for (Iterator<String> it1 = list.iterator(); it1.hasNext();) {
			System.out.println(it1.next());
		}

		// for 循環
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}

		// for 循環加強版
		for (String i : list) {
			System.out.println(i);
		}

	}

}
		
		

ArrayList 轉為 Array

		
		String[] array = {"/bin/sh","-c"};
		List<String> list = new ArrayList<String>(Arrays.asList(array));
	    list.add("command");
	    list.add("param");
	   
	    String[] command = (String[]) list.toArray(new String[0]);
	    System.out.println(Arrays.toString(command));
		
		

1.5.2.1. ArrayList to String

				
		List<String> list = new ArrayList<String>();
	    list.add("command");
	    list.add("param");
	   
	    String listString = String.join(", ", list);
	    
	    System.out.println(listString);
	    		
			

1.5.2.2. Array to List

				Arrays.asList(array)
			

1.5.2.3. List to Array

				
		List<String> list = new ArrayList<String>();
		list.add("str1");
		list.add("str2");

		String[] array = (String[]) list.toArray();
		System.out.println(array);				
				
			

1.5.3. Set 轉為 List

			
		// 將Map Key 轉化為List      
        List<String> mapKeyList = new ArrayList<String>(map.keySet());    
        System.out.println("mapKeyList:"+mapKeyList);  
          
        // 將Map Key 轉化為List      
        List<String> mapValuesList = new ArrayList<String>(map.values());    
        System.out.println("mapValuesList:"+mapValuesList);  			
			
		
		
Set<Type> set = new Set<>();
Set<Type> set = new HashSet<>();		
		
		

1.5.4. List.of()

		
List<String> strings = List.of("first", "second");		
		
		

1.5.5. List.copyOf()

			
var list = List.of("Java", "Python", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
			
		
		
var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy); // false
		
		

1.5.6. ArrayList forEach

		
List<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.add("D");
arrayList.add("E");

for (String item:arrayList){
    System.out.println(item);
}

arrayList.forEach(item->System.out.println(item));

arrayList.forEach(System.out::println);

arrayList.forEach(item->{
    if("C".equals(item)){
        System.out.println(item);
    }
});		
		
		

1.5.7. ArrayList stream()

		
arrayList.stream()
        .filter(s-> s.contains("B")||s.contains("C"))
        .forEach(System.out::println);

arrayList.stream()
        .filter(s->s.contains("E"))
        .findFirst().ifPresent(s -> System.out.println(s));		
		
		

1.5.8. Set.of()

		
Set<Integer> ints = Set.of(1, 2, 3);		
		
		

1.5.9. Collection to Array

Collection.toArray(IntFunction)

		
	@Test
    public void testCollectionToArray(){
        Set<String> names = Set.of("Fred", "Wilma", "Barney", "Betty");
        String[] copy = new String[names.size()];
        names.toArray(copy);
        System.out.println(Arrays.toString(copy));
        System.out.println(Arrays.toString(names.toArray(String[]::new)));
    }
		
		

1.5.10. ArrarList 轉換為 string[]

		
  ArrayList list = new ArrayList();

  list.Add("aaa");

  list.Add("bbb");

  string[] arrString = (string[])list.ToArray(typeof( string)) ;		
		
		

1.5.11. string[] 轉換為 ArrarList

		
  ArrayList list = new ArrayList(new string[] { "aaa", "bbb" });		
		
		

1.5.12. ArrayList 轉換為 string

		
  ArrayList list = new ArrayList();

  list.Add("aaa");

  list.Add("bbb");

  string str= string.Join(",", (string[])list.ToArray(typeof( string)));		
		
		

1.5.13. string 轉換為 ArrayList

		
  string str="1,2,3,4,5";
  ArrayList b = new ArrayList( str.Split(',') ) ;		
		
		

1.5.14. String[] to List

		
String[] arr = new String[] {"1", "2"};
List list = Arrays.asList(arr);