Collections
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();
}
...
}