集合的好帮手:Collections 工具类 --《JAVA编程思想》74

Java 提供了原生的 java.util.Collections 工具类,里面包含了大量的静态方法服务于 Collection 的各种操作,特此记录和大家一起学习!

1.返回类型安全的容器

  • 返回受到类型安全检查的容器

Collections.checkedList(List<E> list, Class<E> type)
list 为受检查的容器,type 为被检查的 class 类型

checkedList() 可以返回对容器进行安全检查的视图,当我们试图往容器中插入不正确的类型时,会抛出类型转换异常:ClassCastException ;

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        List list = arrayList;
        list.add("a");
        System.out.println(list);
        List<Integer> typeSafeList = Collections.checkedList(arrayList, Integer.class);
        list = typeSafeList;
        list.add("b");
    }
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, a]
Exception in thread "main" java.lang.ClassCastException: Attempt to insert class java.lang.String element into collection with element type class java.lang.Integer
	at java.util.Collections$CheckedCollection.typeCheck(Collections.java:3037)
	at java.util.Collections$CheckedCollection.add(Collections.java:3080)
	at mtn.baymax.charpter17.CollectionsExpand.main(CollectionsExpand.java:20)

相同的方法类似还有:

  • 返回安全类型检查的 Colleciton

checkedCollection(Collection<E> c, Class<E> type)

  • 返回安全类型检查的 Map

checkedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType)

  • 返回安全类型检查的 Set

checkedSet(Set<E> s, Class<E> type)

  • 返回安全类型检查的 SortedMap

checkedSortedMap(SortedMap<K, V> m, Class<K> keyType, Class<V> valueType)

  • 返回安全类型检查的 SortedSet

checkedSortedSet(SortedSet<E> s, Class<E> type)

2.获取容器内最大/最小的元素

  • 返回容器内最大的元素

max(Collection<? extends T> coll)

  • 返回容器内最小的元素

min(Collection<? extends T> coll)

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Integer max = Collections.max(arrayList);
        System.out.println(max);
        Integer min = Collections.min(arrayList);
        System.out.println(min);
    }
6
1

我们也可以通过实现 Comparator 接口来自定义比较规则:

max(Collection<? extends T> coll, Comparator<? super T> comp)

min(Collection<? extends T> coll, Comparator<? super T> comp)

IntegerComparator 为自定义的比较规则,认为最小的即为“最大值”,故 Collections.max() 返回 1;

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        class IntegerComparator implements Comparator<Integer> {
            @Override
            public int compare(Integer i1, Integer i2) {
                if (i1 > i2) return -1;
                if (i1 < i2) return 1;
                return 0;
            }
        }
        Integer max = Collections.max(arrayList,new IntegerComparator());
        System.out.println(max);
    }
1

3.获取LIst片段第一次/最后一次出现的位置

  • 获取 List 片段第一次出现的位置

indexOfSubList(List<?> source, List<?> target) ;
source 为源容器,target 为对比的片段

  • 获取 List 片段最后一次出现的位置

lastIndexOfSubList(List<?> source, List<?> target) ;
source 为源容器,target 为对比的片段

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> a1 = new ArrayList<>(Arrays.asList(integers));
        Integer[] ints = {4, 5, 6};
        ArrayList<Integer> a2 = new ArrayList<>(Arrays.asList(ints));
        System.out.println(Collections.indexOfSubList(a1, a2));
        System.out.println(Collections.lastIndexOfSubList(a1, a2));
    }
3
15

4.批量替换

  • 批量替换某个值

replaceAll(List list, T oldVal, T newVal)
list 为执行容器,oldVal 为旧值,newVal 为新值

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Collections.replaceAll(arrayList,1,0);
        System.out.println(arrayList);
    }
[0, 2, 3, 4, 5, 6, 0, 2, 3, 4, 5, 6, 0, 2, 3, 4, 5, 6]

5.List倒序

  • List 倒序排列

reverse(List<?> list)

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Collections.reverse(arrayList);
        System.out.println(arrayList);
    }
[6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1]
  • 返回逆转容器内元素自然排序规则的 Comparator

reverseOrder()

  • 将传入的 Comparator 排序规则逆转

reverseOrder(Comparator cmp)

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Comparator<Object> comparator1 = Collections.reverseOrder();
        Collections.sort(arrayList,comparator1);
        System.out.println(arrayList);
        Comparator<Object> comparator2 = Collections.reverseOrder(comparator1);
        Collections.sort(arrayList,comparator2);
        System.out.println(arrayList);
    }
[6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1]
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]

6.打乱元素顺序

  • 打乱容器内元素顺序

shuffle(List<?> list)

  • 打乱容器内元素顺序,并指定随机来源(可确保每次运行时,获得的随机数是一致的)

shuffle(List<?> list, Random rnd)

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> a1 = new ArrayList<>(Arrays.asList(integers));
        Collections.shuffle(a1, new Random(47));
        System.out.println(a1);
        Collections.shuffle(a1);
        System.out.println(a1);
        ArrayList<Integer> a2 = new ArrayList<>(Arrays.asList(integers));
        Collections.shuffle(a2, new Random(47));
        System.out.println(a2);
        Collections.shuffle(a2);
        System.out.println(a2);
    }

[1, 2, 2, 1, 4, 4, 2, 4, 5, 6, 3, 5, 1, 6, 6, 5, 3, 3]
[2, 1, 4, 1, 5, 6, 5, 2, 1, 4, 6, 3, 5, 3, 3, 2, 4, 6]
[1, 2, 2, 1, 4, 4, 2, 4, 5, 6, 3, 5, 1, 6, 6, 5, 3, 3]
[2, 6, 4, 6, 1, 1, 4, 5, 3, 3, 2, 4, 1, 2, 5, 5, 3, 6]

7.自定义排序

  • 自然升序

sort(List list)

  • 自定义排序

sort(List list, Comparator<? super T> c)
list 为排序容器,Comparator 为制定排序规则的实现类

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Collections.sort(arrayList);
        System.out.println(arrayList);
        //降序排列的Comparator实现
        class IntegerComparator implements Comparator<Integer> {
            @Override
            public int compare(Integer i1, Integer i2) {
                if (i1 > i2) return -1;
                if (i1 < i2) return 1;
                return 0;
            }
        }
        Collections.sort(arrayList, new IntegerComparator());
        System.out.println(arrayList);
    }
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
[6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1]

8.复制元素

  • 将一个 List 的元素复制到另一个 List,会替换原有容器内对应位置的元素

copy(List<? super T> dest, List<? extends T> src)
dest 为目标容器,src 为复制源

    public static void main(String[] args) {
        Integer[] ints1 = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> a1 = new ArrayList<>(Arrays.asList(ints1));
        Integer[] ints2 = {11, 12, 13, 14, 15, 16};
        ArrayList<Integer> a2 = new ArrayList<>(Arrays.asList(ints2));
        Collections.copy(a1,a2);
        System.out.println(a1);
    }
[11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

9.交换元素位置

  • 交换对应下标元素的位置,通常比自己实现的方法效率高

swap(List<?> list, int i, int j)
list 为执行容器,i 和 j 为两个位置对应的下标

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Collections.swap(arrayList, 0, 5);
        System.out.println(arrayList);
    }

[6, 2, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

10.填充元素

  • 使用指定元素填充容器内所有位置的元素

fill(List<? super T> list, T obj)
list 为执行容器, obj 为填充对象

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Collections.fill(arrayList, 0);
        System.out.println(arrayList);
    }
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

11.快速构建List

  • 返回指定长度、由 T 构成的 List

<T> List<T> nCopies(int n, T o)
n 为容器长度,o 为填充对象

    public static void main(String[] args) {
        List<Integer> integers = Collections.nCopies(10, 12);
        System.out.println(integers);
        List<Double> doubles = Collections.nCopies(10, 2.4);
        System.out.println(doubles);
        List<String> strings = Collections.nCopies(10, "A");
        System.out.println(strings);
    }
[12, 12, 12, 12, 12, 12, 12, 12, 12, 12]
[2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4]
[A, A, A, A, A, A, A, A, A, A]

12.判断元素是否有交集

  • 判断两个容器是否有交集,当没有任何相同的元素时返回 true ,否则返回 false

disjoint(Collection<?> c1, Collection<?> c2)

    public static void main(String[] args) {
        Integer[] ints1 = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> a1 = new ArrayList<>(Arrays.asList(ints1));
        Integer[] ints2 = {1, 2, 3, 4, 5, 6};
        ArrayList<Integer> a2 = new ArrayList<>(Arrays.asList(ints2));
        System.out.println(Collections.disjoint(a1, a2));
        Integer[] ints3 = {7, 8, 9};
        ArrayList<Integer> a3 = new ArrayList<>(Arrays.asList(ints3));
        System.out.println(Collections.disjoint(a1, a3));
    }
false
true

13.统计元素个数

  • 统计容器内相同元素的个数

frequency(Collection<?> c, Object o)
c 为执行容器,o 为需统计的对象

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        System.out.println(Collections.frequency(arrayList, 5));
    }
3

14.返回空容器

  • 返回空 List

<T> List<T> emptyList()

  • 返回空 List

<T> List<T> emptyList()

  • 返回空 List

<T> List<T> emptyList()

返回值支持指定泛型,当试图往容器添加元素时,会抛出不支持此操作的异常: UnsupportedOperationException

    public static void main(String[] args) {
        List<Object> list = Collections.emptyList();
        Map<Object, Object> map = Collections.emptyMap();
        Set<Object> set = Collections.emptySet();
        list.add("a");
    }
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at mtn.baymax.charpter17.CollectionsExpand.main(CollectionsExpand.java:16)

15.返回只读容器

  • 返回不可修改的 List

<T> List <T> unmodifiableList(List<? extends T> list)

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        List<Integer> unmodifiableList = Collections.unmodifiableList(arrayList);
        unmodifiableList.add(7);
    }

当试图往不可修改的 LIst 中放入元素时,会抛出不支持的操作类型异常: UnsupportedOperationException 。

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
	at mtn.baymax.charpter17.CollectionsExpand.main(CollectionsExpand.java:16)

类似的方法还有:unmodifiableCollection() 、 unmodifiableMap() 、unmodifiableSet();

16.返回指定元素下标

  • 根据 key 返回 List 中对应元素下标

binarySearch(List<? extends Comparable<? super T>> list, T key)
list 为执行容器,key 为存储元素

使用 binarySearch() 之前,推荐对 List 进行排序,否则当 List 中有重复元素时,无法保证查找到具体的某一个;排序后,默认只找到第一个出现的元素;

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6};
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(integers));
        Collections.sort(arrayList);
        System.out.println(arrayList);
        int index = Collections.binarySearch(arrayList, 5);
        System.out.println(index);
    }
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
13

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值