【Java集合】Collections工具类使用技巧,让你的编程更高效!

嗨~ 今天的你过得还好吗?

愿你听过震耳欲聋的掌声,

仍能走无人问津的小路。

🌞

- 2023.11.27 -

前言

在之前的文章中,我们学习了单列集合的两大接口及其常用的实现类;在这些接口或实现类中,为我们提供了不少的实用的方法。

本篇文章我们来介绍一种java开发者为我们提供了一个工具类,让我们更好的来使用集合。

Collections 工具类

介绍

Collections 是一个操作Set,List,Map等的集合工具类。

它提供了一系列静态的方法对集合元素进行排序、查询和修改等的操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。

常用功能

通过java的api文档,可以看到Collections了很多方法,我们在此就挑选几个常用的功能,为大家演示一下使用:

public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。

public static <T> void sort(List<T> list):根据元素的自然顺序 对指定列表按升序进行排序

public static <T> void sort(List<T> list,Comparator<? super T> ): 根据指定比较器产生的顺序对指定列表进行排序。

直接撸代码:

java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

public class Demo1Collections {

    public static void main(String[] args) {

        //创建一个List 集合
        List<Integer> numbers = new ArrayList<>();
        //在这里咱们顺便使用下Collections的addAll()方法
        Collections.addAll(numbers, 3,34,345,66,22,1);

        System.out.println("原集合" + numbers);
        //使用排序算法
        Collections.sort(numbers);
        System.out.println("排序之后"+numbers);

        Collections.shuffle(numbers);
        System.out.println("乱序之后" + numbers);

        //创建一个字符串List 集合
        List<String> stringDemo = new ArrayList<>();
        stringDemo.add("nihao");
        stringDemo.add("hello");
        stringDemo.add("wolrd");
        stringDemo.add("all");
        System.out.println("原集合" + stringDemo);
        //使用排序算法
        Collections.sort(stringDemo);
        System.out.println("排序之后"+stringDemo);

        List<Person> people = new ArrayList<>();
        people.add(new Person("秋香", 15));
        people.add(new Person("石榴姐", 19));
        people.add(new Person("唐伯虎", 12));
        System.out.println("--" + people);
        
        //如果Person类中,这里报错了,为什么呢? 在这里埋个伏笔,且看下文
        Collections.sort(people);
        
        System.out.println("----" + people);

    }
}

Comparable 和 Comparator

Comparable 接口实现 集合排序

我们上面代码最后一个例子,使用了我们自定义的类型,在使用排序时,给我们报错了?这是为什么呢?整型包装类和字符串类型,和我们的自定义类型有什么区别?

那我们通过API文档,看看这个方法,可以看到 根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的。 而Comparable 接口只有一个方法 int compareTo(T o)比较此对象与指定对象的顺序。

你还在苦恼找不到真正免费的编程学习平台吗?可以试试云端源想!课程视频、在线书籍、在线编程、实验场景模拟、一对一咨询......你想要的全部学习资源这里都有,重点是统统免费!点这里即可查看

说的白话一些,就是我们使用自定义类型,进行集合排序的时候,需要实现这个Comparable接口,并且重写 compareTo(T o)。

java 复制代码
public class Person2 implements Comparable<Person2>{
    private String name;
    private int age;

    public Person2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person2{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Person2 o) {
        //重写方法如何写呢?
//        return 0; //默认元素都是相同的
        //自定义规则   我们通过person 的年龄进行比较  this 代表本身,而 o 代表传参的person对象
        //这里的比较规则
        //  ==》  升序 自己 - 别人
        //  ==》  降序 别人 - 自己
//        return this.getAge() - o.getAge(); //升
        return o.getAge() - this.getAge(); //降

    }
}


public class Demo2Comparable {

    public static void main(String[] args) {
        List<Person2> people2 = new ArrayList<>();
        people2.add(new Person2("秋香", 15));
        people2.add(new Person2("石榴姐", 19));
        people2.add(new Person2("唐伯虎", 12));
        System.out.println("--" + people2);

        //这里报错了,为什么呢?
        Collections.sort(people2);

        System.out.println("----" + people2);
    }
}

Comparator 实现排序

使用Comparable 接口实现排序,是一种比较死板的方式,我们每次都要让自定义类去实现这个接口,那如果我们的自定义类只是偶尔才会去做排序,这种实现方式,不就很麻烦吗!

所以工具类还为我们提供了一种灵活的排序方式,当我需要做排序的时候,去选择调用该方法实现

public static <T> void sort(List<T> list, Comparator<? super T> c)

根据指定比较器产生的顺序对指定列表进行排序。我们通过案例来看看该方法的使用

java 复制代码
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

public class Demo3Comparator {
    public static void main(String[] args) {

        List<Person> people = new ArrayList<>();
        people.add(new Person("秋香", 15));
        people.add(new Person("石榴姐", 19));
        people.add(new Person("唐伯虎", 12));
        System.out.println("--" + people);

        //第二个参数 采用匿名内部类的方式传参 - 可以复习之前有关内部类的使用
        Collections.sort(people, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //这里怎么用呢 自定义按年龄排序
//                return 0;
//                return o1.getAge() - o2.getAge(); //升序
                return o2.getAge() - o1.getAge(); //降序

                //结论: 前者 -后者  升序 反之,降序
                //这种方式 我们优先使用
            }
        });
        System.out.println("排序后----" + people);
    }
}

Comparable 和 Comparator

Comparable: 强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

Comparator: 强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

小结

Collections 是 Java 中用于操作集合的工具类,它提供了一系列静态方法来对集合进行排序、查找、遍历等操作。在 Java 中,Map 是一种特殊的集合,用于存储键值对数据。虽然 Collections 类的部分方法可以直接操作 Map 的键或值的集合视图,但并不能直接对整个 Map 进行操作。

Collections 类提供了一些静态方法来对 Map 的键或值集合视图进行操作,比如排序、查找最大值、查找最小值等。例如,Collections.sort 方法可以对 List 类型的集合进行排序,而 List 类型的 map.keySet() 和 map.values() 返回的集合都可以使用这个方法进行排序。同样地,Collections.max 和 Collections.min 也可以用于获取集合中的最大值和最小值。

另外,对于整个 Map 的操作,可以直接使用 Map 接口提供的方法进行操作,比如 put、get、remove 等。如果需要对整个 Map 进行操作,一般直接调用 Map 接口提供的方法会更加方便和直观。

总之,Collections 类主要用于操作集合类(比如 List、Set),而对于 Map 类型的操作,一般直接使用 Map 接口提供的方法即可。

还是老生常谈,熟能生巧!多练!happy ending!!

相关推荐
卑微的Coder42 分钟前
Redis Set集合命令、内部编码及应用场景(详细)
java·数据库·redis
CrissChan1 小时前
Pycharm 函数注释
java·前端·pycharm
启航挨踢2 小时前
java学习电子书推荐
java
wgslucky2 小时前
Dubbo报错:module java.base does not “opens java.lang“ to unnamed module
java·开发语言·dubbo
DougLiang3 小时前
关于easyexcel动态下拉选问题处理
java·开发语言
mochensage3 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
计蒙不吃鱼4 小时前
一篇文章实现Android图片拼接并保存至相册
android·java·前端
小海编码日记4 小时前
Java八股-JVM & GC
java
全职计算机毕业设计4 小时前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
东阳马生架构4 小时前
商品中心—1.B端建品和C端缓存的技术文档
java