Java中Compareable和Comparator两种比较器的区别
Java中Compareable和Comparator两种比较器的区别
参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html
1.引言
在java这个处处是对象的世界里,对两个对象进行按某一属性进行比较是特别常见的需求。比如书店中的书按照价格比较,亦或者是学生按照成绩进行排名等等。
对于JDK8而言,有三种实现对象比较的方法:
1、在需要比较的对象类中覆写Object类的equals()方法;
2、需要比较的类继承Comparable接口,然后在其类内部实现compareTo()方法;
3、抛去需要被比较的类,在其外部自定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。
第一种方法比较便于理解,复写equals()方法一般用于自己实现的对象数组排序,已经在我们上一篇文章 Java的equals方法的使用技巧 中进行了简单介绍,需要了解的朋友可以自行查看。本文我们主要介绍内部比较器compareable和外部比较器comparator两种。
2.内部比较器Compareable的用法
这种方式就是让自己编写的类继承Comparable接口,并实现接口的compareTo()方法,这种情况下,在使用java.util.Arrays.sort()方法时不用指定具体的比较器。
以书店的图书为例,具体实例代码如下:
 import java.util.Arrays;
 class BookCook implements Comparable<BookCook>{
 	private String title;
 	private double price;
 	public BookCook(String title,double price){
 		this.title = title;
 		this.price = price;
 	}
 	@Override
 	public String toString() {
 		return "书名:"+this.title+",价格:"+this.price;
 	}
 	@Override
 	public int compareTo(BookCook o) {
 		if(this.price > o.price){
 			return 1;
 		}else if(this.price < o.price){
 			return -1;
 		}else{
 			return 0;
 		}
 	}
 }
在写代码时要注意两点:
(1)时刻要统一比较对象,在这里就是BookCook
(2)在重写的compareTo()方法中,需要特别注意的是,返回值的正负始终与this待比较对象保证同步,即当this值比指定对象大时,就返回正数1,小于时就返回负数-1,相等时就返回0.
3.外部比较器Comparator的用法
从JDK1.8开始出现了Comparator接口,它的出现解决了当需要在已经开发好的代码基础上完善对象的比较功能时不想更改之前的代码的问题。这种情况下,我们就需要单独自定义一个对象比较器,继承Comparator接口。当需要进行比较时,就new一个对象比较器。
以学生成绩为例,具体实现代码如下:
 class Student {
 	private String name;
 	private double score;
 	public Student(String name,double score){
 		this.name = name;
 		this.score = score;
 	}
 	public double getScore(){
 		return this.score;
 	}
 	@Override
 	public String toString() {
 		return "姓名:"+this.name+",分数:"+this.score;
 	}
 }
    //自定义对象比较器
 class StudentComparator implements Comparator<Student> {
 	@Override
 	public int compare(Student o1,Student o2) {
 		if(o1.getScore() > o2.getScore()){
 			return 1;
 		}else if(o1.getScore() < o2.getScore()){
 			return -1;
 		}else{
 			return 0;
 		}
 	}
 }
 public class TestComparator {
 	public static void main(String[] args) {
 		Student[] sts = new Student[]{
 				new Student("小戴",60),
 				new Student("小王",90),
 				new Student("老王",80),
 				new Student("小萱",95)
 		};
             //当需要比较功能时,需要在待比较对象后new一个自定义的比较器,以便其按照自定义比较器中的规则进行比较。
 		java.util.Arrays.sort(sts, new StudentComparator());
 		System.out.println(java.util.Arrays.toString(sts));
 	}
 }
Java中Compareable和Comparator两种比较器的区别的更多相关文章
- java中Comparable和Comparator两种比较器的区别
		Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ... 
- Java中HashMap遍历的两种方式
		Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ... 
- java中数组复制的两种方式
		在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ... 
- PHP中数组合并的两种方法及区别介绍
		PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ... 
- java中设置代理的两种方式
		1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ... 
- java中创建字符串的两种方式(“”与new String())及区别
		结论:通过""创建的字符串实际上在java堆中只有一个,而通过new string创建出来的字符串在java堆中占有不同的内存. 第一个True表明这两个在内存中拥有相同的地址,那 ... 
- java中实现同步的两种方式:syschronized和lock的区别和联系
		Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ... 
- 【转载】 Java中String类型的两种创建方式
		本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ... 
- Java中实现多线程的两种方式之间的区别
		Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ... 
随机推荐
- CSS:定位概述
			background-position 背景定位 如果,说浮动, 关键在一个 "浮" 字上面, 那么 我们的定位,关键在于一个 "位" 上. PS: 定位是我们 ... 
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:花瓣识别
			import os import glob import os.path import numpy as np import tensorflow as tf from tensorflow.pyth ... 
- 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)
			题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ... 
- 为typecho添加分类描述
			typecho 默认主题不显示分类描述,可以调整为显示 按找官方文档(点击查看),获取分类描述的代码为: <?php echo $this->getDescription(); ?> ... 
- Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)
			http://blog.csdn.net/on2way/article/details/47028969 http://blog.csdn.net/mokeding/article/details/1 ... 
- CAN数据格式-BLF
			欢迎关注<汽车软件技术>公众号,回复关键字获取资料. Vector工具录制的数据,一般有ASC和BLF两种格式,本文介绍ASC. 1.BLF定义 BLF(binary logging fo ... 
- 关于and 和or的执行优先级问题分析
			题目:列出本店价低于60或者高于100.并且商品点击数大于628的商品. 按照下面两种写法,得到的结果是不同的. 第一种:结果数据中有点击数为628的记录,显然不符合题目要求. SELECTgoods ... 
- Pytorch本人疑问(1) torch.nn和torch.nn.functional之间的区别
			在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看 ... 
- vs2013中配置SQLite数据库
			转载:https://maplefan.com/index.php/2019/08/14/visual-studio-2013%e9%85%8d%e7%bd%aesqlite3%e7%9a%84%e6 ... 
- Linux centosVMware运行告警系统、分发系统-expect讲解、自动远程登录后,执行命令并退出、expect脚本传递参数、expect脚本同步文件、指定host和要同步的文件、shell项目-分发系统-构建文件分发系统、分发系统-命令批量执行
			一运行告警系统 创建一个任务计划crontab -e 每一分钟都执行一次 调试时把主脚本里边log先注释掉 再次执行 没有发现502文件说明执行成功了,每日有错误,本机IP 负载不高 二.分发系统-e ... 
