知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
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
public static List<String> list = new ArrayList<String>(); static { list.add("錄入"); list.add("變更"); list.add("收藏"); list.add("在售"); list.add("展出"); }
判斷元素是否存在
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));
List<String> list = new ArrayList<String>(); list.add("command"); list.add("param"); String listString = String.join(", ", list); System.out.println(listString);
// 將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<>();
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
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); } });
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));
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))); }
ArrayList list = new ArrayList(); list.Add("aaa"); list.Add("bbb"); string[] arrString = (string[])list.ToArray(typeof( string)) ;
ArrayList list = new ArrayList(); list.Add("aaa"); list.Add("bbb"); string str= string.Join(",", (string[])list.ToArray(typeof( string)));
string str="1,2,3,4,5"; ArrayList b = new ArrayList( str.Split(',') ) ;