首页 > 编程语言 >Java程序员必备技能:Collections工具类深度解析!

Java程序员必备技能:Collections工具类深度解析!

时间:2023-11-28 11:15:27浏览次数:53  
标签:Java name age 程序员 Collections 排序 public String

在之前的文章中,我们学习了单列集合的两大接口及其常用的实现类;在这些接口或实现类中,为我们提供了不少的实用的方法。
本篇文章我们来介绍一种java开发者为我们提供了一个工具类,让我们更好的来使用集合

Collections 工具类

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

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

  • public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
  • public static void sort(List list):根据元素的自然顺序 对指定列表按升序进行排序
  • public static void sort(List list,Comparator<? super T> ): 根据指定比较器产生的顺序对指定列表进行排序。

直接撸代码:

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)。

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)

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

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!!

标签:Java,name,age,程序员,Collections,排序,public,String
From: https://www.cnblogs.com/ydyxcode/p/17861420.html

相关文章

  • java 为解决导入部门名称是中文,部门名称转换成部门ID
    一、业务实现:(Server层)/***为解决导入部门名称是中文,部门名称转换成部门ID*key:部门名称*value:部门ID**/Map<String,Integer>getOrgNameToIdMapping();二、业务层(SercerImpl)/***为解决导入部门名称是中文,部门名称转换成部......
  • Java集合ArrayList,LinkedList,Vector的相同点与区别是什么?
    ✨前言✨本篇作为,java集合中ArrayList,LinkedList,Vector常用集合的分析概括,已便大家认识这三种集合的区别,和特点......
  • Android app兼容低版本Java环境
    原文地址:Androidapp兼容低版本Java环境-Stars-One的杂货小窝起因是修复一个Bug遇到的问题,找到了一个可以让app兼容低版本java的方法众所周知,Android版本更新后,其内置的JRE环境也随之更新了假如我们在app中用到了JDK8的特有的属性,而用户的手机设备系统还是比较低,而没......
  • Java 第三方链接请求工具
    importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importorg.apache.http.Consts;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.NameValuePair;importorg.apache.http.client.entity.Url......
  • Java8使用并行流(ParallelStream)注意事项
    本文转载自简书:https://www.jianshu.com/p/51c1d4f1bf84著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Java8并行流ParallelStream和Stream的区别就是支持并行执行,提高程序运行效率。但是如果使用不当可能会发生线程安全的问题。Demo如下:1publics......
  • 用java写一个抽奖程序
    需求分析1)实现三个基本功能:登录、注册、抽奖。2)登录:用户输入账号密码进行登录,输入账号后会匹配已注册的用户,若输入用户不存在则退出,密码有三次输入机会,登录成功后主界面会显示已登录用户的账号信息。3)注册:用户首先输入账号名称,系统查询此名称是否存在,如存在则请求用户换一个名称,......
  • Java 实现统一社会信用代码有效性校验
    一、调用工具类:importcom.yf.utils.StringUtils;importjava.util.HashMap;importjava.util.Map;/***统一社会信用代码有效性校验**@authorFengQing*@programruoyi-vue-file*@description*@date2023/09/11*/publicclassTyshxydmVerificationUtil......
  • Java 将JSON数组转成List对象集合
     一、从对象列表中提取并组装JSON字段的数据:(工具类)publicclassJsonMsgUtils<T>{/***从对象列表中提取并组装JSON字段的数据。**@paramlogs包含对象的列表*@paramtargetClass目标对象类型,表示JSON消息的结构......
  • Java并发编程:面向对象思想与并发编程思想的融合
    1.封装共享变量1.1识别可变化与不变的共享变量识别可变化与不可变化的共享变量。针对初始化后不再改变的变量,可以添加final修饰。不仅编译器编译更快,也对后续开发人员指明了变量属性,更防范了意想不到的修改行为。1.2针对可变化的共享变量,进行封装处理针对共享变量的访问,若......
  • Java实现并行功能
    Java8线程池异步处理-->针对小包大MyTask 类中的 compute() 方法首先检查任务的规模是否小于等于1。如果是,它直接返回任务的结果。否则,它将任务拆分成两个子任务(leftTask 和 rightTask),并使用 fork() 方法将它们提交到 ForkJoinPool 中执行。这里定义了一个名为 My......