| 知乎專欄 | 多維度架構 | | | 微信號 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(',') ) ;