首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Collections 工具類精華:排序、查找、打亂、填充、交換一網打盡

     編輯:Java 綜合教學

前言:為什麼要用 Collections?

java.util.Collections 是操作 Collection、Map 的「瑞士軍刀」,提供 30+ 個 static 方法,覆蓋排序、二分查找、反轉、洗牌、交換、填充、同步包裝、不可視圖等高頻場景。本文精選 6 大核心方法實戰演示,助你少寫樣板代碼。

一、六大高頻靜態方法速查

方法簽名作用前置條件
sortsort(List<T> list) / sort(List<T>, Comparator)自然順序/定制順序排序元素實現 Comparable / 傳 Comparator
binarySearchbinarySearch(List<T>, T key) / binarySearch(List<T>, T, Comparator)二分查找索引列表必須已排序
reversereverse(List<?> list)原地反轉列表無
shuffleshuffle(List<?> list) / shuffle(List<?>, Random)隨機打亂 (洗牌算法)無
swapswap(List<?>, int i, int j)交換兩個位置元素索引合法
fillfill(List<? super T>, T obj)用指定元素替換所有位置無

二、完整實戰代碼

import java.util.*;

public class CollectionsDemo {
    public static void main(String[] args) {
        List list = new ArrayList<>(Arrays.asList(
            "zhangsan", "lisi", "wangwu", "zhaoliu", "tianqi"
        ));
        print("初始", list);

        // 1. 交換索引 1 和 2
        Collections.swap(list, 1, 2);
        print("swap(1,2)", list); // lisi <-> wangwu

        // 2. 自然排序 (字典序)
        Collections.sort(list);
        print("sort()", list); // lisi, tianqi, wangwu, zhangsan, zhaoliu

        // 3. 二分查找 (前提:已排序)
        int idx = Collections.binarySearch(list, "zhaoliu");
        System.out.println("binarySearch('zhaoliu') = " + idx); // 4

        // 4. 打亂順序
        Collections.shuffle(list);
        print("shuffle()", list); // 隨機順序

        // 5. 填充統一值
        Collections.fill(list, "jay");
        print("fill('jay')", list); // [jay, jay, jay, jay, jay]
    }

    static void print(String label, List list) {
        System.out.print(label + ": ");
        list.forEach(s -> System.out.print(s + " "));
        System.out.println();
    }
}

三、進階技巧與避坑

1. binarySearch 前提:列表必須有序

未排序列表調用結果不可預測 (可能返回負數插入點)。永遠在 sort 後調用。

2. sort 穩定性

  • JDK 8+ 使用 TimSort (歸併+插入混合),穩定排序:相等元素相對位置不變。
  • 對象數組用 Arrays.sort (雙軸快排,不穩定);對象列表用 Collections.sort (穩定)。

3. shuffle 隨機源可控

// 可復現的洗牌 (測試/調試用)
Collections.shuffle(list, new Random(12345L));

4. 同步包裝與不可視圖

// 線程安全 List/Set/Map (性能一般,高併發建議用 java.util.concurrent)
List syncList = Collections.synchronizedList(new ArrayList<>());
Set syncSet = Collections.synchronizedSet(new HashSet<>());
Map syncMap = Collections.synchronizedMap(new HashMap<>());

// 迭代時必須手動同步鎖住集合對象!
synchronized (syncList) {
    for (String s : syncList) { /* ... */ }
}

// 不可修改視圖 (防禦性編程)
List unmod = Collections.unmodifiableList(list);
unmod.add("x"); // 拋 UnsupportedOperationException

5. 極值獲取

Collections.max(list);           // 自然順序最大值
Collections.min(list, cmp);      // 定制比較器最小值
Collections.frequency(list, "a"); // 統計元素出現次數
Collections.disjoint(list1, list2); // 判斷無交集

四、總結

Collections 以靜態方法封裝經典算法,排序用 sort、查找用 binarySearch (前提有序)、打亂用 shuffle、填充用 fill、交換用 swap、反轉用 reverse。掌握這 6 大核心 + 同步包裝/不可視圖/極值統計,日常集合操作無需造輪子。記住:binarySearch 前必排序,shuffle 可指定種子,同步包裝迭代必加鎖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved