对于JDK8而言,有三种实现对象比较的方法:

1、在需要比较的对象类中覆写Object类的equals()方法;

2、需要比较的类继承Comparable接口,然后在其类内部实现compareTo()方法;

3、抛去需要被比较的类,在其外部自定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。

由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。

第一种方法比较便于理解,复写equals()方法一般用于自己实现的对象数组排序,已经在我们上一篇文章

2.内部比较器Compareable的用法

这种方式就是让自己编写的类继承Comparable接口,并实现接口的compareTo()方法,这种情况下,在使用java.util.Arrays.sort()方法时不用指定具体的比较器。

以书店的图书为例,具体实例代码如下:

1 import java.util.Arrays;

2

3 class BookCook implements Comparable{

4 private String title;

5 private double price;

6 public BookCook(String title,double price){

7 this.title = title;

8 this.price = price;

9 }

10 @Override

11 public String toString() {

12 return "书名:"+this.title+",价格:"+this.price;

13 }

14 @Override

15 public int compareTo(BookCook o) {

16 if(this.price > o.price){

17 return 1;

18 }else if(this.price < o.price){

19 return -1;

20 }else{

21 return 0;

22 }

23 }

24 }

在写代码时要注意两点:

(1)时刻要统一比较对象,在这里就是BookCook

(2)在重写的compareTo()方法中,需要特别注意的是,返回值的正负始终与this待比较对象保证同步,即当this值比指定对象大时,就返回正数1,小于时就返回负数-1,相等时就返回0.

3.外部比较器Comparator的用法

从JDK1.8开始出现了Comparator接口,它的出现解决了当需要在已经开发好的代码基础上完善对象的比较功能时不想更改之前的代码的问题。这种情况下,我们就需要单独自定义一个对象比较器,继承Comparator接口。当需要进行比较时,就new一个对象比较器。

以学生成绩为例,具体实现代码如下:

1 class Student {

2 private String name;

3 private double score;

4 public Student(String name,double score){

5 this.name = name;

6 this.score = score;

7 }

8 public double getScore(){

9 return this.score;

10 }

11 @Override

12 public String toString() {

13 return "姓名:"+this.name+",分数:"+this.score;

14 }

15

16 }

//自定义对象比较器

17 class StudentComparator implements Comparator {

18 @Override

19 public int compare(Student o1,Student o2) {

20 if(o1.getScore() > o2.getScore()){

21 return 1;

22 }else if(o1.getScore() < o2.getScore()){

23 return -1;

24 }else{

25 return 0;

26 }

27 }

28 }

29 public class TestComparator {

30

31 public static void main(String[] args) {

32

33 Student[] sts = new Student[]{

34 new Student("小戴",60),

35 new Student("小王",90),

36 new Student("老王",80),

37 new Student("小萱",95)

38 };

39 //当需要比较功能时,需要在待比较对象后new一个自定义的比较器,以便其按照自定义比较器中的规则进行比较。

40 java.util.Arrays.sort(sts, new StudentComparator());

41 System.out.println(java.util.Arrays.toString(sts));

42 }

43 }

java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别相关推荐

  1. java多线程区别_Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  2. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  3. java map遍历_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  4. java中两种遍历集合的方式_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  5. java中集合的排序_Java中集合排序的两种方法

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  6. java hashmap遍历顺序_Java中HashMap遍历的两种方式

    第一种: Map map =  HashMap(); Iterator iter = map.entrySet().iterator(); (iter.hasNext()) { Map.Entry e ...

  7. java final f的区别_Java中final、finally、finalize的简单区别,中等区别,详细区别(Lawliet 修改+注释版)...

    简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符. 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类 ...

  8. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  9. java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...

    内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.protected. ...

最新文章

  1. 解决SQL SERVER LDF文件过大的问题
  2. cocos2dx-lua之断点调试支持
  3. CentOS 7下Python环境设置 - 1
  4. linux 关闭网络防火墙设置方法,CentOS Linux防火墙配置及关闭方法
  5. C# 7.1先睹为快(第一部分)
  6. python 画树 递归_数据结构 - python如何递归生成树?
  7. nacos 公共_技术分享——使用nacos作注册中心和配置中心
  8. 8款功能强大的最新HTML5特效实例
  9. python网络请求_Python HTTP请求
  10. matlab weibpdf函数,MATLAB常用函数
  11. 解除电脑宽带限制,提升电脑网速
  12. 计算机竞赛 自主招生,想参加自主招生,五大学科竞赛如何选取?
  13. iphone html 手机震动,iPhone来电不会震动怎么回事?简单几招排查技巧
  14. 正规的棋牌游戏开发公司需要具备哪些条件
  15. Hadoop-HDFS
  16. 研究生带28岁腼腆导师一起相亲?被女生围追堵截要微信!
  17. 默纳克系统服务器怎么查看历史故障,默纳克3000主板怎么看历史故障
  18. Linux FQ 队列实现原理浅析
  19. 文旅夜游项目如何做好景区内容建设
  20. 从Redis+Lua到Goroutine,日均10亿次的股票行情计算实践

热门文章

  1. 测试网页速度性能的利器-Yslow和page speed
  2. Ansible自动化运维工具介绍
  3. Git学习笔记03--git reset
  4. (转)编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程
  5. 转:ECharts图表组件之简单关系图:如何轻松实现另类站点地图且扩展节点属性实现点击节点页面跳转...
  6. Unity3D热更新全书-脚本(二) 两级分化
  7. Android Sdcard 可用空间大小
  8. 用js操作table、tr、td 「字体样式及TD背景图片」
  9. linux视频教程之dhcp
  10. Windows Server 2012 R2/2016 此工作站和主域间的信任关系失败