排序操作
Collections提供以下方法對List進行排序操作
void reverse(List list):反轉
void shuffle(List list),隨機排序
void sort(List list),按自然排序的升序排序
void sort(List list, Comparator c);定制排序,由Comparator控制排序邏輯
void swap(List list, int i , int j),交換兩個索引位置的元素
void rotate(List list, int distance),旋轉。當distance為正數時,將list后distance個元素整體移到前面。當distance為負數時,將 list的前distance個元素整體移到后面。
下面簡單演示Collections操作List
1 package collection; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 7 public class CollectionsTest { 8 public static void main(String[] args) { 9 ArrayList nums = new ArrayList(); 10 nums.add(8); 11 nums.add(-3); 12 nums.add(2); 13 nums.add(9); 14 nums.add(-2); 15 System.out.println(nums); 16 Collections.reverse(nums); 17 System.out.println(nums); 18 Collections.sort(nums); 19 System.out.println(nums); 20 Collections.shuffle(nums); 21 System.out.println(nums); 22 //下面只是為了演示定制排序的用法,將int類型轉成string進行比較 23 Collections.sort(nums, new Comparator() { 24 25 @Override 26 public int compare(Object o1, Object o2) { 27 // TODO Auto-generated method stub 28 String s1 = String.valueOf(o1); 29 String s2 = String.valueOf(o2); 30 return s1.compareTo(s2); 31 } 32 33 }); 34 System.out.println(nums); 35 } 36 }
執行結果,
1 [8, -3, 2, 9, -2] 2 [-2, 9, 2, -3, 8] 3 [-3, -2, 2, 8, 9] 4 [9, -2, 8, 2, -3] 5 [-2, -3, 2, 8, 9]
查找,替換操作
int binarySearch(List list, Object key), 對List進行二分查找,返回索引,注意List必須是有序的
int max(Collection coll),根據元素的自然順序,返回最大的元素。 類比int min(Collection coll)
int max(Collection coll, Comparator c),根據定制排序,返回最大元素,排序規則由Comparatator類控制。類比int min(Collection coll, Comparator c)
void fill(List list, Object obj),用元素obj填充list中所有元素
int frequency(Collection c, Object o),統計元素出現次數
int indexOfSubList(List list, List target), 統計targe在list中第一次出現的索引,找不到則返回-1,類比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替換舊元素。
下面示范簡單用法,
1 package collection.collections; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 6 public class CollectionsTest { 7 public static void main(String[] args) { 8 ArrayList num = new ArrayList(); 9 num.add(3); 10 num.add(-1); 11 num.add(-5); 12 num.add(10); 13 System.out.println(num); 14 System.out.println(Collections.max(num)); 15 System.out.println(Collections.min(num)); 16 Collections.replaceAll(num, -1, -7); 17 System.out.println(Collections.frequency(num, 3)); 18 Collections.sort(num); 19 System.out.println(Collections.binarySearch(num, -5)); 20 } 21 }
執行結果,
1 [3, -1, -5, 10] 2 10 3 -5 4 1 5 1
同步控制
Collections中幾乎對每個集合都定義了同步控制方法,例如 SynchronizedList(), SynchronizedSet()等方法,來將集合包裝成線程安全的集合。下面是Collections將普通集合包裝成線程安全集合的用法,
1 package collection.collections; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Collections; 6 import java.util.HashMap; 7 import java.util.HashSet; 8 import java.util.List; 9 import java.util.Map; 10 import java.util.Set; 11 12 public class SynchronizedTest { 13 public static void main(String[] args) { 14 Collection c = Collections.synchronizedCollection(new ArrayList()); 15 List list = Collections.synchronizedList(new ArrayList()); 16 Set s = Collections.synchronizedSet(new HashSet()); 17 Map m = Collections.synchronizedMap(new HashMap()); 18 } 19 }
設置不可變(只讀)集合
Collections提供了三類方法返回一個不可變集合,
emptyXXX(),返回一個空的只讀集合(這不知用意何在?)
singleXXX(),返回一個只包含指定對象,只有一個元素,只讀的集合。
unmodifiablleXXX(),返回指定集合對象的只讀視圖。
用法如下,
1 package collection.collections; 2 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Set; 9 10 public class UnmodifiableCollection { 11 public static void main(String[] args) { 12 List lt = Collections.emptyList(); 13 Set st = Collections.singleton("avs"); 14 15 Map mp = new HashMap(); 16 mp.put("a",100); 17 mp.put("b", 200); 18 mp.put("c",150); 19 Map readOnlyMap = Collections.unmodifiableMap(mp); 20 21 //下面會報錯 22 lt.add(100); 23 st.add("sdf"); 24 mp.put("d", 300); 25 } 26 }
執行結果,
1 Exception in thread "main" java.lang.UnsupportedOperationException 2 at java.util.AbstractList.add(Unknown Source) 3 at java.util.AbstractList.add(Unknown Source) 4 at collection.collections.UnmodifiableCollection.main(UnmodifiableCollection.java:22)