Collections

felix.shao2025-02-16

Collections

简述

Collections 简介

 Collections 是一个工具类。其主要是方便对集合进行操作的,可以让我们在编程过程中轻松解决数组相关的问题,简化代码的开发。

详述

核心方法
public class Collections {

    /** 集合添加元素 */
    public static <T> boolean addAll(Collection<? super T> c, T... elements)...;

    /** 双向队列转为栈形式的队列 */
    public static <T> Queue<T> asLifoQueue(Deque<T> deque)...;

    /** 二分查找 */
    public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)...;

    /** 检查集合元素,返回安全的元素。PS:由于泛型机制存在,List<String> JDK8 版本可以添加 Interger 元素 */
    public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)...;

    /** 复制集合 */
    public static <T> void copy(List<? super T> dest, List<? extends T> src) ...;

    /** 判断 2 个集合是否不相交 */
    public static boolean disjoint(Collection<?> c1, Collection<?> c2)...;

    /** 获取一个空的集合 */
    public static final <T> List<T> emptyList()...;

    /** 返回指定集合上的枚举,只能遍历 */
    public static <T> Enumeration<T> enumeration(final Collection<T> c)...;

    /** 填充元素 */
    public static <T> void fill(List<? super T> list, T obj)...;
    
    /** 返回等于某个元素的集合数量 */
    public static int frequency(Collection<?> c, Object o)...;

    /** 返回第一个 source 集合匹配的 target 集合索引位置 */
    public static int indexOfSubList(List<?> source, List<?> target)...;

    /** 从末尾开始遍历,返回第一个 source 集合匹配的 target 集合索引位置 */
    public static int lastIndexOfSubList(List<?> source, List<?> target)...;

    /** 枚举集合转集合 */
    public static <T> ArrayList<T> list(Enumeration<T> e)...;

    /** 最大值 */
    public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)...;

    /** 最小值 */
    public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)...;  

    /** 返回一个不可变列表组成的 n 个拷贝的指定对象 */
    public static <T> List<T> nCopies(int n, T o)...;

    /** map转set */
    public static <E> Set<E> newSetFromMap(Map<E, Boolean> map)...;

    /** 替换元素 */
    public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)...;

    /** 逆序 */
    public static void reverse(List<?> list)...;

    /** 将指定的元素旋转指定的距离.PS: 假如有个序列列 list 是 [a,b,c,d],调用方法 Collections.rotate(list, 1) 后,得到的 list 就变为了 [d,a,b,c]。 */
    public static void rotate(List<?> list, int distance)...;

    /** 使用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的. PS:通俗一点的说,就像洗牌一样,随机打乱原来的顺序 */
    public static void shuffle(List<?> list)...;

    /** 返回单一的列表 */
    public static <T> List<T> singletonList(T o)...;

    /** 排序,复用的 Arrays.sort 方法 */
    public static <T extends Comparable<? super T>> void sort(List<T> list)...;

    /** 交换值 */
    public static void swap(List<?> list, int i, int j)...;

    /** 返回线程安全的 List */
    public static <T> List<T> synchronizedList(List<T> list)...;

    /** 返回不可修改的 List */
    public static <T> List<T> unmodifiableList(List<? extends T> list)...;
}
synchronizedList

 Collections.synchronizedXXX 方法,基本原理相同,即有一个对象锁,然后所有方法都会添加 synchronized 关键字,因此是线程安全的。贴核心代码如下:

static class SynchronizedCollection<E> implements Collection<E>, Serializable{

    final Collection<E> c;  // Backing Collection
    final Object mutex;     // Object on which to synchronize

    SynchronizedCollection(Collection<E> c) {
        this.c = Objects.requireNonNull(c);
        mutex = this;
    }

    public boolean add(E e) {
        synchronized (mutex) {return c.add(e);}
    }

    // 所有的方法都添加了synchronized 关键字,因此确保了线程安全
    ...

}

TIP

 这种方式性能很有问题,一般很少使用。

unmodifiableList

 Collections.unmodifiableXXX,基本原理相同,即有一个 final 集合,然后不对外提供添加、移除元素的方法。

static class UnmodifiableList<E> extends UnmodifiableCollection<E> implements List<E>{
    
    final List<? extends E> list;

    public E get(int index) {return list.get(index);}

    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }

    ...
}

附录一、参考文献

Last Updated 2/18/2025, 2:43:17 PM