Collections
這裡就是簡單介紹一下,之後我推薦第三方的庫,但是對於初學者的我們還是需要了解一下工具類的使用,JDK中提供了一種集合操作的工具類-Collections
public class Collections extends Object
複製程式碼
1.排序操作(主要針對List介面相關)
編號 | 方法名稱 | 型別 | 描述 |
---|---|---|---|
1 | public static void reverse(List<?> list) | 普通方法 | 反轉指定List集合中元素的順序 |
2 | public static void shuffle(List<?> list) | 普通方法 | 對List中的元素進行隨機排序(洗牌) |
3 | public static void sort(List<T> list) | 普通方法 | 對List裡的元素根據自然升序排序 |
4 | public static void sort(List<T> list, Comparator<? super T> c) | 普通方法 | 自定義比較器進行排序 |
5 | public static void swap(List<?> list, int i, int j) | 普通方法 | 將指定List集合中i處元素和j出元素進行交換 |
6 | public static void rotate(List<?> list,int distance) | 普通方法 | 將所有元素向右移位指定長度, 如果distance等於size那麼結果不變 |
package com.shxt.demo05;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
//反轉指定List集合中元素的順序
Collections.reverse(list);
System.out.println("reverse後的順序:"+list);
//對List中的元素進行隨機排序(洗牌)
Collections.shuffle(list);
System.out.println("shuffle後的順序:"+list);//每次都不一樣
//對List裡的元素根據自然升序排序
Collections.sort(list);
System.out.println("sort後順序:" + list);
//將指定List集合中i處元素和j出元素進行交換
Collections.swap(list, 1, 3);
System.out.println("swap後順序:" + list);
//將所有元素向右移位指定長度,如果distance等於size那麼結果不變
Collections.rotate(list, 2);
System.out.println("rotate後順序:" + list);
}
}
/*
執行結果:
reverse後的順序:[E, D, C, B, A]
shuffle後的順序:[B, A, E, D, C]
sort後順序:[A, B, C, D, E]
swap後順序:[A, D, C, B, E]
rotate後順序:[B, E, A, D, C]
*/
複製程式碼
2.查詢和替換(主要針對Collection介面相關)
編號 | 方法名稱 | 型別 | 描述 |
---|---|---|---|
1 | public static void binarySearch(List<? extends Comparable<? super T>> list, T key) | 普通方法 | 使用二分搜尋法,以獲得指定物件在List中的索引,前提是集合已經排序 |
2 | public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) | 普通方法 | 返回最大元素 |
3 | public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp) | 普通方法 | 根據自定義比較器,返回最大元素 |
4 | public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) | 普通方法 | 返回最小元素 |
5 | public static <T> T min(Collection<? extends T> coll,Comparator<? super T> comp) | 普通方法 | 根據自定義比較器,返回最小元素 |
6 | public static <T> void fill(List<? super T> list, T obj) | 普通方法 | 使用指定元素替換指定列表中的所有元素 |
7 | public static int frequency(Collection<?> c, Object o) | 普通方法 | 返回指定集合中指定物件出現的次數 |
8 | public static <T> boolean replaceAll(List list, T oldVal, T newVal) | 普通方法 | 替換 |
package com.shxt.demo05;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo02 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("C");
list.add("D");
list.add("C");
list.add("C");
list.add("E");
System.out.println("max:" + Collections.max(list));
System.out.println("min:" + Collections.min(list));
System.out.println("frequency:" + Collections.frequency(list, "C"));
Collections.replaceAll(list, "C", "HanPang");
System.out.println("replaceAll之後:" + list);
// 如果binarySearch的物件沒有排序的話,搜尋結果是不確定的
System.out.println("binarySearch在sort之前:" + Collections.binarySearch(list, "E"));
Collections.sort(list);
// sort之後,結果出來了
System.out.println("排序後的結果:" + list);
System.out.println("binarySearch在sort之後:" + Collections.binarySearch(list, "E"));
Collections.fill(list, "^_^");
System.out.println("fill:" + list);
}
}
/*
執行結果:
max:E
min:A
frequency:4
replaceAll之後:[A, B, HanPang, HanPang, D, HanPang, HanPang, E]
binarySearch在sort之前:-3
排序後的結果:[A, B, D, E, HanPang, HanPang, HanPang, HanPang]
binarySearch在sort之後:3
fill:[^_^, ^_^, ^_^, ^_^, ^_^, ^_^, ^_^, ^_^]
*/
複製程式碼
3.其他方法
編號 | 方法名稱 | 型別 | 描述 |
---|---|---|---|
1 | public static boolean disjoint(Collection c1, Collection c2) | 普通方法 | 如果兩個指定 collection 中沒有相同的元素,則返回 true。 |
2 | public static <T> boolean addAll(Collection<? super T> c, T... elements) | 普通方法 | 一種方便的方式,將所有指定元素新增到指定 collection 中 |
3 | public static <T> Comparator<T> reverseOrder() | 普通方法 | 返回一個比較器,它強行反轉指定比較器的順序。 如果指定比較器為 null,則此方法等同於 reverseOrder() |
package com.shxt.demo05;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo03 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("悟空");
list.add("悟能");
list.add("悟淨");
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
Collections.addAll(list1,"林沖","宋江","吳用","悟能");
Collections.addAll(list2,"林黛玉","賈寶玉","薛寶釵");
//disjoint檢查兩個Collection是否的交集
boolean flag1 = Collections.disjoint(list,list1);
boolean flag2 = Collections.disjoint(list,list2);
System.out.println("list和list1交集結果:"+flag1);
System.out.println("list和list2交集結果:"+flag2);
// 利用reverseOrder倒序
Collections.sort(list1, Collections.reverseOrder());
System.out.println(list1);
}
}
/*
執行結果:
list和list1交集結果:false
list和list2交集結果:true
[林沖, 悟能, 宋江, 吳用]
*/
複製程式碼
分割線:方法量力而為
4.設定不可變集合
何為“不可變”,無法修改返回容器的內容,注意,這裡指的是無法直接通過set
或者add
方法修改容器內reference
的指向,而不是禁止reference
指向內容的修改。
為什麼要使用不可變集合?
- 當物件被不可信的庫呼叫時,不可變形式是安全的;
- 不可變物件被多個執行緒呼叫時,不存在競態條件問題
- 不可變集合不需要考慮變化,因此可以節省時間和空間。所有不可變的集合都比它們的可變形式有更好的記憶體利用率(分析和測試細節);
- 不可變物件因為有固定不變,可以作為常量來安全使用。
編號 | 方法名稱 | 型別 | 描述 |
---|---|---|---|
1 | emptyXxx()開頭的方法 | 普通方法 | 返回一個空的不可變的集合物件(LIst/Map/Set) |
2 | singletonXxx()開頭的方法 | 普通方法 | 返回一個只包含指定物件的,不可變的集合物件。 |
3 | unmodifiableXxx()開頭的方法 | 普通方法 | 返回指定集合物件的不可變檢視 |
package com.shxt.demo05;
import java.util.*;
public class Demo04 {
public static void main(String[] args) {
//建立一個空的,不可改變的List物件
List<?> list = Collections.emptyList();
System.out.println(list);
//建立一個只有一個元素,且不可改變的map物件
Map<String,String> map = Collections.singletonMap("name","悟空");
System.out.println(map);
//建立一個普通的Map物件
Map<String,Integer> scores= new HashMap<String,Integer>();
scores.put("英語", 85);
scores.put("數學", 88);
//返回普通的Map物件對應的不可變的版本
Map<String,Integer> unmodifiaMap= Collections.unmodifiableMap(scores);
//若在不可變的版本中繼續新增資料則會丟擲UnsupportedOperationException異常
unmodifiaMap.put("Java",99);
}
}
/*
執行結果:
[]
{name=悟空}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.put(Collections.java:1457)
at com.shxt.demo05.Demo04.main(Demo04.java:20)
*/
複製程式碼
5.同步控制
Collections工具類中提供了多個synchronizedXxx方法,該方法返回指定集合物件對應的同步物件,從而解決多執行緒併發訪問集合時執行緒的安全問題。HashSet、ArrayList、HashMap都是執行緒不安全的,如果需要考慮同步,則使用這些方法。這些方法主要有:synchronizedSet、synchronizedSortedSet、synchronizedList、synchronizedMap、synchronizedSortedMap。
編號 | 方法名稱 | 型別 | 描述 |
---|---|---|---|
1 | public static Collection synchronizedCollection(Collection c) | 普通方法 | 返回指定 Collection 支援的同步(執行緒安全的)Collection |
2 | public static List synchronizedList(List list) | 普通方法 | 返回指定列表支援的同步(執行緒安全的)列表 |
3 | public static Map synchronizedMap(Map m) | 普通方法 | 返回由指定對映支援的同步(執行緒安全的)對映 |
4 | public static Set synchronizedSet(Set s) | 普通方法 | 返回指定 Set 支援的同步(執行緒安全的)Set |
package com.shxt.demo05;
import java.util.*;
public class Demo05 {
public static void main(String[] args) {
//下面程式建立4個同步的集合物件
Collection c= Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s= Collections.synchronizedSet(new HashSet());
Map m= Collections.synchronizedMap(new HashMap());
}
}
複製程式碼
目前簡單瞭解一下,以後我們還會學習google開源的庫Guava
6.java.util.Collection和java.util.Collections區別
- java.util.Collection 是一個集合介面(集合類的一個頂級介面)。它提供了對集合物件進行基本操作的通用介面方法。Collection介面在Java 類庫中有很多具體的實現。Collection介面的意義是為各種具體的集合提供了最大化的統一操作方式,其直接繼承介面有List與Set。
- java.util.Collections 是一個包裝類(工具類/幫助類)。它包含有各種有關集合操作的靜態多型方法。此類不能例項化,就像一個工具類,用於對集合中元素進行排序、搜尋以及執行緒安全等各種操作,服務於Java的Collection框架。