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

YDYXCODE · · 760 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
>在之前的文章中,我们学习了单列集合的两大接口及其常用的实现类;在这些接口或实现类中,为我们提供了不少的实用的方法。 本篇文章我们来介绍一种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); } } ``` ## Comparable 和 Comparator ### Comparable 接口实现集合排序 我们上面代码最后一个例子,使用了我们自定义的类型,在使用排序时,给我们报错了?这是为什么呢?整型包装类和字符串类型,和我们的自定义类型有什么区别? 那我们通过API文档,看看这个方法,可以看到 根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的。 而Comparable 接口只有一个方法 int compareTo(T o)比较此对象与指定对象的顺序。 >你还在苦恼找不到真正免费的编程学习平台吗?可以试试云端源想!课程视频、在线书籍、在线编程、实验场景模拟、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费![点这里即可查看](https://ydcode.cn/memberIndex?sourceId=339) 说的白话一些,就是我们使用自定义类型,进行集合排序的时候,需要实现这个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!!
760 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传