Collections 工具類常用方法:
- 排序
- 查找,替換操作
- 同步控制(不推薦,需要線程安全的集合類型時請考慮使用 JUC 包下的并發集合)
排序操作
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個元素整體移到后面。
示例代碼:
ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(-1);arrayList.add(3);arrayList.add(3);arrayList.add(-5);arrayList.add(7);arrayList.add(4);arrayList.add(-9);arrayList.add(-7);System.out.println("原始數組:");System.out.println(arrayList);// void reverse(List list):反轉Collections.reverse(arrayList);System.out.println("Collections.reverse(arrayList):");System.out.println(arrayList);Collections.rotate(arrayList, 4);System.out.println("Collections.rotate(arrayList, 4):");System.out.println(arrayList);// void sort(List list),按自然排序的升序排序Collections.sort(arrayList);System.out.println("Collections.sort(arrayList):");System.out.println(arrayList);// void shuffle(List list),隨機排序Collections.shuffle(arrayList);System.out.println("Collections.shuffle(arrayList):");System.out.println(arrayList);// void swap(List list, int i , int j),交換兩個索引位置的元素Collections.swap(arrayList, 2, 5);System.out.println("Collections.swap(arrayList, 2, 5):");System.out.println(arrayList);// 定制排序的用法Collections.sort(arrayList, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}});System.out.println("定制排序后:");System.out.println(arrayList);
查找,替換操作
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)//用指定的元素代替指定list中的所有元素。 int frequency(Collection c, Object o)//統計元素出現次數 int indexOfSubList(List list, List target)//統計target在list中第一次出現的索引,找不到則返回-1,類比int lastIndexOfSubList(List source, list target). boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替換舊元素
示例代碼:
ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(-1);arrayList.add(3);arrayList.add(3);arrayList.add(-5);arrayList.add(7);arrayList.add(4);arrayList.add(-9);arrayList.add(-7);ArrayList<Integer> arrayList2 = new ArrayList<Integer>();arrayList2.add(-3);arrayList2.add(-5);arrayList2.add(7);System.out.println("原始數組:");System.out.println(arrayList);System.out.println("Collections.max(arrayList):");System.out.println(Collections.max(arrayList));System.out.println("Collections.min(arrayList):");System.out.println(Collections.min(arrayList));System.out.println("Collections.replaceAll(arrayList, 3, -3):");Collections.replaceAll(arrayList, 3, -3);System.out.println(arrayList);System.out.println("Collections.frequency(arrayList, -3):");System.out.println(Collections.frequency(arrayList, -3));System.out.println("Collections.indexOfSubList(arrayList, arrayList2):");System.out.println(Collections.indexOfSubList(arrayList, arrayList2));System.out.println("Collections.binarySearch(arrayList, 7):");// 對List進行二分查找,返回索引,List必須是有序的Collections.sort(arrayList);System.out.println(Collections.binarySearch(arrayList, 7));
同步控制
Collections提供了多個synchronizedXxx()
方法·,該方法可以將指定集合包裝成線程同步的集合,從而解決多線程并發訪問集合時的線程安全問題。
我們知道 HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap 都是線程不安全的。Collections提供了多個靜態方法可以把他們包裝成線程同步的集合。
最好不要用下面這些方法,效率非常低,需要線程安全的集合類型時請考慮使用 JUC 包下的并發集合。
方法如下:
synchronizedCollection(Collection<T> c) //返回指定 collection 支持的同步(線程安全的)collection。 synchronizedList(List<T> list)//返回指定列表支持的同步(線程安全的)List。 synchronizedMap(Map<K,V> m) //返回由指定映射支持的同步(線程安全的)Map。 synchronizedSet(Set<T> s) //返回指定 set 支持的同步(線程安全的)set。
Collections還可以設置不可變集合,提供了如下三類方法:
emptyXxx(): 返回一個空的、不可變的集合對象,此處的集合既可以是List,也可以是Set,還可以是Map。 singletonXxx(): 返回一個只包含指定對象(只有一個或一個元素)的不可變的集合對象,此處的集合可以是:List,Set,Map。 unmodifiableXxx(): 返回指定集合對象的不可變視圖,此處的集合可以是:List,Set,Map。 上面三類方法的參數是原有的集合對象,返回值是該集合的”只讀“版本。
示例代碼:
ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(-1);arrayList.add(3);arrayList.add(3);arrayList.add(-5);arrayList.add(7);arrayList.add(4);arrayList.add(-9);arrayList.add(-7);HashSet<Integer> integers1 = new HashSet<>();integers1.add(1);integers1.add(3);integers1.add(2);Map scores = new HashMap();scores.put("語文" , 80);scores.put("Java" , 82);//Collections.emptyXXX();創建一個空的、不可改變的XXX對象List<Object> list = Collections.emptyList();System.out.println(list);//[]Set<Object> objects = Collections.emptySet();System.out.println(objects);//[]Map<Object, Object> objectObjectMap = Collections.emptyMap();System.out.println(objectObjectMap);//{}//Collections.singletonXXX();List<ArrayList<Integer>> arrayLists = Collections.singletonList(arrayList);System.out.println(arrayLists);//[[-1, 3, 3, -5, 7, 4, -9, -7]]//創建一個只有一個元素,且不可改變的Set對象Set<ArrayList<Integer>> singleton = Collections.singleton(arrayList);System.out.println(singleton);//[[-1, 3, 3, -5, 7, 4, -9, -7]]Map<String, String> nihao = Collections.singletonMap("1", "nihao");System.out.println(nihao);//{1=nihao}//unmodifiableXXX();創建普通XXX對象對應的不可變版本List<Integer> integers = Collections.unmodifiableList(arrayList);System.out.println(integers);//[-1, 3, 3, -5, 7, 4, -9, -7]Set<Integer> integers2 = Collections.unmodifiableSet(integers1);System.out.println(integers2);//[1, 2, 3]Map<Object, Object> objectObjectMap2 = Collections.unmodifiableMap(scores);System.out.println(objectObjectMap2);//{Java=82, 語文=80}//添加出現異常:java.lang.UnsupportedOperationException
// list.add(1);
// arrayLists.add(arrayList);
// integers.add(1);
?