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

YunDuanCode · · 1086 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

> 在之前的文章中,我们学习了单列集合的两大接口及其常用的实现类;在这些接口或实现类中,为我们提供了不少的实用的方法。 本篇文章我们来介绍一种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> ): 根据指定比较器产生的顺序对指定列表进行排序。 直接撸代码: ``` 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); } } ``` ## cComparable 和 Comparator ### Comparable 接口实现集合排序 我们上面代码最后一个例子,使用了我们自定义的类型,在使用排序时,给我们报错了?这是为什么呢?整型包装类和字符串类型,和我们的自定义类型有什么区别? 那我们通过API文档,看看这个方法,可以看到 根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的。 而Comparable 接口只有一个方法 int compareTo(T o)比较此对象与指定对象的顺序。 > 编程学习,从云端源想开始,课程视频、在线书籍、在线编程、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费![点这里即可查看](https://ydcode.cn/memberIndex?sourceId=340) 说的白话一些,就是我们使用自定义类型,进行集合排序的时候,需要实现这个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!!

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1086 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传