目录

一、常用功能

二、Comparator比较器

三、Comparable和Comparator两个接口的区别


一、常用功能

java.utils.Collections 是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> boolean addAll(Collection<T> c, T... elements)     往集合中添加一些元素。
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;/*- java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:- public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。- public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。*/
public class Demo01Collections {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();//往集合中添加多个元素/*list.add("a");list.add("b");list.add("c");list.add("d");list.add("e");*///public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。Collections.addAll(list,"a","b","c","d","e");System.out.println(list);//[a, b, c, d, e]//public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。Collections.shuffle(list);System.out.println(list);//[b, d, c, a, e]}
}

二、Comparator比较器

public static <T> void sort(List<T> list) : 将集合中元素按照默认规则排序。
字符串类型为例,
public class CollectionsDemo2 {
        public static void main ( String [] args ) {
                ArrayList < String > list = new ArrayList < String > ();
                list . add ( "cba" );
                list . add ( "aba" );
                list . add ( "sba" );
                list . add ( "nba" );
                //排序方法
                Collections . sort ( list );
                System . out . println ( list );
        }
}

结果,

[aba, cba, nba, sba]
import java.util.ArrayList;
import java.util.Collections;/*- java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。注意:sort(List<T> list)使用前提被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则Comparable接口的排序规则:自己(this)-参数:升序*/
public class Demo02Sort {public static void main(String[] args) {ArrayList<Integer> list01 = new ArrayList<>();list01.add(1);list01.add(3);list01.add(2);System.out.println(list01);//[1, 3, 2]//public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。Collections.sort(list01);//默认是升序System.out.println(list01);//[1, 2, 3]ArrayList<String> list02 = new ArrayList<>();list02.add("a");list02.add("c");list02.add("b");System.out.println(list02);//[a, c, b]Collections.sort(list02);System.out.println(list02);//[a, b, c]ArrayList<Person> list03 = new ArrayList<>();list03.add(new Person("张三",18));list03.add(new Person("李四",20));list03.add(new Person("王五",15));System.out.println(list03);//[Person{name='张三', age=18}, Person{name='李四', age=20}, Person{name='王五', age=15}]Collections.sort(list03);System.out.println(list03);}
}
public class Person implements Comparable<Person>{private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"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;}//重写排序的规则@Overridepublic int compareTo(Person o) {//return 0;//认为元素都是相同的//自定义比较的规则,比较两个人的年龄(this,参数Person)//return this.getAge() - o.getAge();//年龄升序排序return o.getAge() - this.getAge();//年龄降序排序}
}
我们使用的是默认的规则完成字符串的排序,那么默认规则是怎么定义出来的呢?
说到排序了,简单的说就是两个对象之间比较大小,那么在 JAVA 中提供了两种比较实现的方式,一种是比较死板的采用 java.lang.Comparable 接口去实现,一种是灵活的当我需要做排序的时候在去选择的java.util.Comparator 接口完成。
那么我们采用的 public static <T> void sort(List<T> list) 这个方法完成的排序,实际上要求了被排序的类型需要实现Comparable 接口完成比较的功能,在 String 类型上如下:
public final class String implements java . io . Serializable , Comparable < String > , CharSequence { }
String 类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我想要字符串按照第一个字符降序排列,那么这样就要修改String 的源代码,这是不可能的了,那么这个时候我们可以使用public static <T> void sort(List<T> list, Comparator<? super T> ) 方法灵活的完成,这个里面就涉及到了Comparator这个接口,位于位于 java.util 包下,排序是 comparator 能实现的功能之一 , 该接口代表一个比较器,比较器具有可比性!顾名思义就是做排序的,通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是:
public int compare(String o1, String o2) :比较其两个参数的顺序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;/*- java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。Comparator和Comparable的区别Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法Comparator:相当于找一个第三方的裁判,比较两个Comparator的排序规则:o1-o2:升序*/
public class Demo03Sort {public static void main(String[] args) {ArrayList<Integer> list01 = new ArrayList<>();list01.add(1);list01.add(3);list01.add(2);System.out.println(list01);//[1, 3, 2]Collections.sort(list01, new Comparator<Integer>() {//重写比较的规则@Overridepublic int compare(Integer o1, Integer o2) {//return o1-o2;//升序return o2-o1;//降序}});System.out.println(list01);ArrayList<Student> list02 = new ArrayList<>();list02.add(new Student("a迪丽热巴",18));list02.add(new Student("古力娜扎",20));list02.add(new Student("杨幂",17));list02.add(new Student("b杨幂",18));System.out.println(list02);/*Collections.sort(list02, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年龄升序排序return o1.getAge()-o2.getAge();}});*///扩展:了解Collections.sort(list02, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年龄升序排序int result =  o1.getAge()-o2.getAge();//如果两个人年龄相同,再使用姓名的第一个字比较if(result==0){result =  o1.getName().charAt(0)-o2.getName().charAt(0);}return  result;}});System.out.println(list02);}
}
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"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;}
}

三、ComparableComparator两个接口的区别

Comparable :强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。只能在类中实现compareTo() 一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort (和 Arrays.sort )进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Comparator 强行对某个对象进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set 或有序映射)的顺序,或者为那些没有自然顺序的对象collection 提供排序。

【Java】Collections相关推荐

  1. 【java】深入分析Java反射-动态代理 proxy

    1.概述 转载:深入分析Java反射(四)-动态代理 [Java]Java 反射机制浅析 [Java]java代理 静态代理 动态代理 proxy [java]静态代理 proxy 2.动态代理的简介 ...

  2. 【java】深入理解Java的动态编译

    文章目录 1.概述 2. 前提 3. 基本原理# 4. JDK动态编译 4.1 实现JavaFileObject 4.2 实现ClassLoader 4.3 实现JavaFileManager 4.4 ...

  3. 【Java】JUC(java.util.concurrent)工具包中的并发相关

    目录 一.AQS详解 AQS原理 AQS 对资源的共享方式 AQS 底层使用了模板方法模式 AQS具体应用举例 ReentrantLock CountDownLatch 二.ConcurrentHas ...

  4. 幼儿园分班问题 【Java】

    幼儿园分班问题 [Java] 题目描述 幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来. 小朋友的编号是整数,与前一位小朋友同班 ...

  5. 【Java】【基础知识】【Java的基本使用】

    [Java][基础知识][Java的基本使用] 基于jdk8 仅个人理解,或有疏漏 基于 java疯狂讲义 第三版和第四版 java核心技术卷一 第十版和第十一版 廖雪峰java课程 一.基本数据与结 ...

  6. 【java】通过spring通过AOP实现日志打印(二)

    本人菜鸡一个,上一篇文章说了说自己对AOP的理解,并留下了一个用spring注解实现AOP的坑,本文就来填填这个坑 该系列暂时有两篇文章: [java]java中的AOP思想(一):https://b ...

  7. 【Java】集合概述

    苦  尽  甘  来  时 , 我  给  你  讲  来  时  的  路 目录 一.什么是集合 二.集合的分类 三.各集合特点 四.各集介绍及使用 一.什么是集合 简单来说,集合就是一个放数据容器 ...

  8. 【Java】eclipse如何导入项目

    [Java]eclipse如何导入项目 1.第一步,打开eclipse,点击file->import 2.第二步,选择general->existing projects into wor ...

  9. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

最新文章

  1. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
  2. 工业4.0时代,SAP助力打造智能化工厂研讨会圆满落幕
  3. 独占电脑装linux,旧电脑如何处理?装Tiny Core,极致精简,超低CPU占用,你敢试吗...
  4. Matlab xcorr函数详解
  5. react全局状态管理_react状态管理redux
  6. Visual C++实现定制标题栏
  7. 20120530, BGP3
  8. [转载][不转不行了^皿^]金庸小说中的十大“公司”
  9. JavaScript函数传参原理详解——值传递还是引用传递
  10. 全国气象预报业务产品grib2数据格式解析
  11. 包装类的自动装箱,自动拆箱
  12. 电脑网络设置出现红叉解决办法,详细步骤并配图,附网盘链接,亲测有效
  13. Python爬虫-爬取手机应用市场中APP下载量
  14. DataGridView 控件中自动生成列
  15. 【vs】vs编译爆出大量莫名其妙错误的解决方法
  16. Android练手小项目---仿凤凰新闻app
  17. Win7 下安装 Visual Studio 2008 失败的解决办法
  18. PCIe driver
  19. surface 部分uwp软件无法联网
  20. mysql 一个sql查出俩个count_sql一个表中同时查询两个count的sql语句

热门文章

  1. mysql 压缩uuid长度_如何压缩UUID长度?
  2. 【C++】优先级队列priority_queue仿函数
  3. 笔记-【游戏制作教程】30分钟制作一款游戏 (1)【Unity】
  4. ----颜色版----
  5. qt210 裸机ac97
  6. EOJ 139 旅游规划 最短路径算法
  7. matlab 约束条件下三元函数的图像问题
  8. c语言printf输出带符号,输出字符串用什么符号-C语言怎么用printf输出字符串。
  9. 【论文分享】Clothes-Changing Person Re-identification with RGB Modality Only
  10. 小小的智能门锁,蕴含着无限科技