JavaSE基礎:Collections工具類

Collections

這裏就是簡單介紹一下,以後我推薦第三方的庫,可是對於初學者的咱們仍是須要了解一下工具類的使用,JDK中提供了一種集合操做的工具類-Collectionsjava

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框架。
相關文章
相關標籤/搜索