从入门到精通:集合工具类Collections全攻略!

发布时间:2023-11-28 15:01:01

在前一篇文章中,我们学习了两个单独收集的接口及其常用的实现类别;在这些接口或实现类别中,我们提供了许多实用的方法。

本文介绍了java开发人员为我们提供工具类,让我们更好地使用集合

Collections 工具类介绍

Collections 这是一个操作Set,List,集合工具类,如Map。image.png它提供了一系列静态方法来排序、查询和修改集合元素,以及设置不可变的集合对象和同步控制集合对象。

常用功能

通过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> ): 指定列表按指定比较器生成的顺序进行排序。

直接滚代码:

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) {        ///创建Listt 集合        List<Integer> numbers = new ArrayList<>();        ///在这里,我们顺便使用Collectionsadall()方法        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);        ///创建一个字符串Listt 集合        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 和 ComparatorComparable 接口实现集合排序

以上代码的最后一个例子使用了我们自定义的类型,并在使用排名时向我们报告了错误?为什么是这样?整个包装类型和字符串类型与我们的自定义类型有什么区别?image.png然后我们可以通过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通过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)自动排序,对象可用作有序映射中的键或有序集中元素,无需指定比较器。<br>Comparator: 强行对某个对象进行整体排序。Comparator 传递给sort方法(如collectionsons).sort或 Arrays.sort),从而允许精确控制排序顺序。Comparator也可以用来控制某些数据结构(如有序set或有序映射)的顺序,或者为没有自然顺序的对象colection提供排序。

小结

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

Collections 该类提供了一些静态方法 Map 按键或值集合视图进行操作,如排序、搜索最大值、搜索最小值等。例如,Collections.sort 方法可以对 List 类型的集合被排序,而 List 类型的 map.keySet() 和 map.values() 这种方法可以用来排序返回的集合。同样地,Collections.max 和 Collections.min 也可用于获得集合中的最大值和最小值。<br>另外,对于整个 Map 可直接使用的操作 Map 操作接口提供的方法,如 put、get、remove 等。假如需要对整个 Map 操作一般直接调用 Map 界面提供的方法将更加方便和直观。

总之,Collections 类别主要用于操作集合类(如 List、Set),而对于 Map 一般直接使用类型操作 Map 接口提供的方法。<br>还是老生常谈,熟能生巧!多练习!happy ending!!

上一篇 Java零基础入门-输入
下一篇 nas实现java

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题