一, 为何需要实现Comparable接口

我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法.

当然, 其中最长用的莫过于排序了(Collections.sort(List l).

下面是1个简单例子:

public class Compare1{

public static void f(){

ArrayList arr = new ArrayList();

arr.add(10);

arr.add(23);

arr.add(7);

System.out.println(arr);

Collections.sort(arr);

System.out.println(arr);

}

}

逻辑很简单, 就是在1个list容器中添加3个int数值(注意实际被自动装箱成Interger对象).

正常输出容器元素一次, 利用Collections.sort()方法排序后, 再输出1次.

输出:

[java] [10, 23, 7]

[java] [7, 10, 23]

但是当List容器添加的元素对象是属于自己写的类时, 就可能出问题了.

例子:

import java.util.ArrayList;

import java.util.Collections;

class Student{

private String name;

private int ranking;

public Student(String name, int ranking){

this.name = name;

this.ranking = ranking;

}

public String toString(){

return this.name + ":" + this.ranking;

}

}

public class Compare2{

public static void f(){

ArrayList arr = new ArrayList();

arr.add(new Student("Jack",10));

arr.add(new Student("Bill",23));

arr.add(new Student("Rudy",7));

System.out.println(arr);

}

}

上面定义了1个Student类, 它只有两个成员, 名字和排名.

在f()方法内, 添加3个Student的对象到1个list容器中, 然后输出(必须重写String方法, 这里不解释了):

[java] [Jack:10, Bill:23, Rudy:7]

到此为止, 是没有问题的.  但是当我对这个容器进行排序时就有问题了.

例如将上面的f()方法改成:

public class Compare2{

public static void f(){

ArrayList arr = new ArrayList();

arr.add(new Student("Jack",10));

arr.add(new Student("Bill",23));

arr.add(new Student("Rudy",7));

System.out.println(arr);

Collections.sort(arr);

System.out.println(arr);

}

}

编译时就会出错:

[java] Caused by: java.lang.ClassCastException: Collection_kng.Comparable_kng.Student cannot be cast to java.lang.Comparable

提示这个类Student没有实现Comparable接口.

原因也很简单, 因为Java不知道应该怎样为Student对象排序, 是应该按名字排序? 还是按ranking来排序?

为什么本文第1个例子就排序成功? 是因为Java本身提供的类Integer已经实现了Comparable接口. 也表明Integer这个类的对象是可以比较的.

而Student类的对象默认是不可以比较的.  除非它实现了Comparable接口.

总而言之,  如果你想1个类的对象支持比较(排序), 就必须实现Comparable接口.

二, Comparable接口简介.

Comparable 接口内部只有1个要重写的关键的方法.

就是

intcompareTo(T o)

这个方法返回1个Int数值,

例如 i = x.compareTo(y)

如果i=0, 也表明对象x与y排位上是相等的(并非意味x.equals(y) = true, 但是jdk api上强烈建议这样处理)

如果返回数值i>0 则意味者, x > y啦,

反之若i<0则 意味x < y

三, Comparable接口的实现及用法.

用回上面的例子, 我们修改Student类, 令其实现Comparable接口并重写compareTo方法.

import java.util.ArrayList;

import java.util.Collections;

class Student implements Comparable{

private String name;

private int ranking;

public Student(String name, int ranking){

this.name = name;

this.ranking = ranking;

}

public String toString(){

return this.name + ":" + this.ranking;

}

public int compareTo(Object o){

Student s = (Student)(o);

return this.ranking - s.ranking;

}

}

public class Compare2{

public static void f(){

ArrayList arr = new ArrayList();

arr.add(new Student("Jack",10));

arr.add(new Student("Bill",23));

arr.add(new Student("Rudy",7));

System.out.println(arr);

Collections.sort(arr);

System.out.println(arr);

}

}

注意重写的compareTo(Object o)方法内.  根据Student的ranking成员来比较的, 也就是说跟姓名无关了.

这时再编译执行, 就能见到List容器内的Student对象已经根据ranking来排序了.

输出:

[java] [Jack:10, Bill:23, Rudy:7]

[java] [Rudy:7, Jack:10, Bill:23]

java comparable接口作用_Java 中 Comparable 接口的意义和用法相关推荐

  1. java return返回值_java中关于return返回值的用法详解

    我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...

  2. java中接口回调_Java中的接口回调实例

    定义: /** * @author Administrator * @project: TestOne * @package: PACKAGE_NAME * @date: 2018/11/30 003 ...

  3. java里面序列化作用_java中序列化的作用

    一  什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...

  4. java finally的作用_java中finally关键字的特点和作用是什么

    java中finally关键字的特点和作用是什么 发布时间:2020-09-08 11:12:01 来源:亿速云 阅读:114 作者:小新 小编给大家分享一下java中finally关键字的特点和作用 ...

  5. java 守护线程 作用_java中守护线程的一些概念和用法

    网上的资料中,守护线程的功能一般都是"只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用 ...

  6. java 构造函数的作用_Java中构造函数的作用(转)

    https://blog.csdn.net/vipmao/article/details/51530954,我觉得讲的非常好,学习到了 构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对 ...

  7. java throws的作用_Java中throws..throw的使用与说明

    throws语句 throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常.对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型.如果异常的 ...

  8. java的rsa作用_java 中RSA的方式实现非对称加密的实例

    java 中rsa的方式实现非对称加密的实例 rsa通俗理解: 你只要去想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密:同理,既然是签名,那肯 ...

  9. java new string作用_java中直接new String对象?

    首先明确一点,在Java中==比较的是两个对象的地址,equals()比较的是两个对象的值,如果使用equals()来替换==,则两个输出结果都为true. 言归正传,为什么第一个返回为false? ...

最新文章

  1. GCB:生态中心邓晔组-增温改变了微生物相互作用关系
  2. 037_Dropdown下拉菜单
  3. MemoryStream 反序列化的报错问题
  4. python识别图片坐标查看器_Opencv/python图像处理后如何获取检测区域的坐标
  5. es审计日志_审计系统的一剂良方——事件溯源
  6. Docker Compose安装以及入门
  7. 毕设题目:Matlab电子琴
  8. 视频文件损坏怎么修复,赤兔视频修复软件助您
  9. 电商项目5:商品模块
  10. Python基础练习-每日一题-大家来找茬!
  11. [转载]Oraclenbsp;grantnbsp;revokenbsp;…
  12. js删除某个节点之后的所有节点
  13. HCIA网络基础9-VRP文件系统管理
  14. 面试官这么表现就有戏?不一定哦!
  15. 2020年Web前端学习网站导航
  16. oracle 倒库详细步骤,科二倒车入库操作步骤高清图解,一步一解读,非常实用!...
  17. 一文读懂命名实体识别
  18. Pandas+Numpy 数据中空值的处理操作:判断、查找、填充及删除
  19. 即第1个字母变成第26个字母,第i个字母变成第26-i+1个字母,非字母字符不变。要求编程序将密码变回原文,并输出密码和原文
  20. c语言中<< , >>的作用

热门文章

  1. OFRecord 数据集加载
  2. H.265视频编码与技术全析(下)
  3. Resource entery xx is already defined
  4. vue 不是内部或外部命令,也不是可运行的程序 或批处理文件
  5. RecyclerView Adapter中notifyDataSetChanged 的作用
  6. AndroidManifest 配置Activity 一直提示找不到,
  7. 使用docker Hub
  8. Android 你知道界面布局嵌套多少层之后会Crash吗
  9. 九零后的五年七次工作经历
  10. ThinkPHP入门(二)