引言:
Collections工具类可以用来操作Collection,还能用来操作Map。
Collections 中提供了一系列静态的方法对集合元素进行排序、查询、修改、复制等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制、返回空集合、检测集合元素类型等方法。功能还是比较强大。
1. 添加元素
- public static <T> boolean addAll(Collection<? super T> c, T… elements)
2. 排序
- public static <T extends Comparable<? super T>> void sort(List<T> list):自然排序
- public static <T> void sort(List<T> list, Comparator<? super T> c):定制排序
- public static void reverse(List<?> list):逆序
- public static <T> Comparator<T> reverseOrder():返回一个与自然排序逆序的比较器,要求泛型T需实现Comparabale接口。
- public static <T> Comparator<T> reverseOrder(Comparator<T> cmp):返回一个与指定比较器逆序的比较器。
- public static void shuffle(List<?> list):每次打乱的顺序都不一样
- public static void shuffle(List<?> list, Random rnd):每次打乱的顺序一样
- public static void swap(List<?> int i, int j):交换对应位置的元素
- public static void rotate(List<?> list, int distance):旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面
3. 查找,统计
- public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
- public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
- public static int indexOfSubList(List> source, List> target)
- public static int lastIndexOfSubList(List> source, List> target)
- public static int frequency(Collection<?> c, Object o)
- public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
- public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
- public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
- public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
- public static disjoint(Collection> c1, Collection> c2):如果两个集合没有相同的集合,则返回 true
4. 替换
- public static <T> void fill(List<? super T> list, T obj)
- public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
5. 复制
- public static <T> void copy(List<? super T> dest, List<? extends T> src)
- public static <T> List<T> nCopies(int n, T o):将 o 复制 n 份,形成不可变 list 并返回
6. 同步控制(返回线程安全的集合)。Collections工具类提供了多个 synchronizedXxx() 方法,这些方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。我们知道Vector是线程安全的,ArrayList是线程不安全的,但是往往ArrayList的执行效率比Vector高,所以可以使用以下方法将ArrayList包装成线程安全的List。
- public static <T> Collection<T> synchronizedCollection(Collection<T> c)
- public static <T> List<T> synchronizedList(List<T> list)
- public static <T> Set<T> synchronizedSet(Set<T> s)
- public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
- public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
- public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
- public static <T> NavigableSet<T> synchronizedNavigableSet(NavigableSet<T> s)
- public static <K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m)
7. 返回一个空集合
- public static <T> List<T> emptyList()
- public static <T> Set<T> emptySet()
- public static <K,V> Map<K,V> emptyMap()
- public static <E> SortedSet<E> emptySortedSet()
- public static <K,V> SortedMap<K,V> emptySortedMap()
- public static <T> Enumeration<T> emptyEnumeration()
- public static <T> Iterator<T> emptyIterator()
- public static <T> ListIterator<T> emptyListIterator()
- public static <E> NavigableSet<E> emptyNavigableSet()
- public static <K,V> NavigableMap<K,V> emptyNavigableMap()
8. 返回一个可进行元素类型检查(添加元素时)的集合,相当于将现有的集合封装成在添加元素时可以进行元素类型检查的集合。
- public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)
- public static <E> List<E> checkedList(List<E> list, Class<E> type)
- public static <E> Set<E> checkedSet(Set<E> s, Class<E> type)
- public static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType, Class<V> valueType)
- public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s, Class<E> type)
- public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K,V> m, Class<K> keyType, Class<V> valueType)
- public static <E> Queue<E> checkedQueue(Queue<E> queue, Class<E> type)
- public static <E> NavigableSet<E> checkedNavigableSet(NavigableSet<E> s, Class<E> type)
- public static <K,V> NavigableMap<K,V> checkedNavigableMap(NavigableMap<K,V> m, Class<K> keyType, Class<V> valueType)
9. 创建只读,不可改变的集合
- public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
- public static <T> List<T> unmodifiableList(List<? extends T> list)
- public static <T> Set<T> unmodifiableSet(Set<? extends T> s)
- public static <K, V> Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m)
- public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
- public static <K, V> SortedMap<K, V> unmodifiableSortedMap(SortedMap<K, ? extends V> m)
- public static <T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T> s)
- public static <K, V> NavigableMap<K, V> unmodifiableNavigableMap(NavigableMap<K, ? extends V> m)
10. 其他
- public static <T> Enumeration<T> enumeration(Collection<T> c)
- public static <E> Set<E> newSetFromMap(Map<E,Boolean> map):提供一个和 Map 实现相对应的Set实现
举例
public class CollectionsTest {
@Test
public void test2() {
List list = new ArrayList();
list.add(123);
list.add(43);
list.add(765);
list.add(-97);
list.add(0);
/*
报异常:IndexOutOfBoundsException("Source does not fit in dest")
List dest = new ArrayList();
Collections.copy(dest, list);
*/
//正确的:
List dest = Arrays.asList(new Object[list.size()]);
System.out.println(dest.size());//list.size();
Collections.copy(dest,list);
System.out.println(dest);
/*
Collections 类中提供了多个 synchronizedXxx() 方法,
该方法可使将指定集合包装成线程同步的集合,从而可以解决
多线程并发访问集合时的线程安全问题
*/
//返回的list1即为线程安全的List
List list1 = Collections.synchronizedList(list);
}
@Test
public void test1() {
List list = new ArrayList();
list.add(123);
list.add(43);
list.add(765);
list.add(765);
list.add(765);
list.add(-97);
list.add(0);
Collections.reverse(list);
Collections.shuffle(list);
Collections.sort(list);
Collections.swap(list,1,2);
int frequency = Collections.frequency(list, 123);
}
}