java comparable接口作用_Java 中 Comparable 接口的意义和用法
一, 为何需要实现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 接口的意义和用法相关推荐
- java return返回值_java中关于return返回值的用法详解
我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...
- java中接口回调_Java中的接口回调实例
定义: /** * @author Administrator * @project: TestOne * @package: PACKAGE_NAME * @date: 2018/11/30 003 ...
- java里面序列化作用_java中序列化的作用
一 什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...
- java finally的作用_java中finally关键字的特点和作用是什么
java中finally关键字的特点和作用是什么 发布时间:2020-09-08 11:12:01 来源:亿速云 阅读:114 作者:小新 小编给大家分享一下java中finally关键字的特点和作用 ...
- java 守护线程 作用_java中守护线程的一些概念和用法
网上的资料中,守护线程的功能一般都是"只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用 ...
- java 构造函数的作用_Java中构造函数的作用(转)
https://blog.csdn.net/vipmao/article/details/51530954,我觉得讲的非常好,学习到了 构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对 ...
- java throws的作用_Java中throws..throw的使用与说明
throws语句 throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常.对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型.如果异常的 ...
- java的rsa作用_java 中RSA的方式实现非对称加密的实例
java 中rsa的方式实现非对称加密的实例 rsa通俗理解: 你只要去想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密:同理,既然是签名,那肯 ...
- java new string作用_java中直接new String对象?
首先明确一点,在Java中==比较的是两个对象的地址,equals()比较的是两个对象的值,如果使用equals()来替换==,则两个输出结果都为true. 言归正传,为什么第一个返回为false? ...
最新文章
- GCB:生态中心邓晔组-增温改变了微生物相互作用关系
- 037_Dropdown下拉菜单
- MemoryStream 反序列化的报错问题
- python识别图片坐标查看器_Opencv/python图像处理后如何获取检测区域的坐标
- es审计日志_审计系统的一剂良方——事件溯源
- Docker Compose安装以及入门
- 毕设题目:Matlab电子琴
- 视频文件损坏怎么修复,赤兔视频修复软件助您
- 电商项目5:商品模块
- Python基础练习-每日一题-大家来找茬!
- [转载]Oraclenbsp;grantnbsp;revokenbsp;…
- js删除某个节点之后的所有节点
- HCIA网络基础9-VRP文件系统管理
- 面试官这么表现就有戏?不一定哦!
- 2020年Web前端学习网站导航
- oracle 倒库详细步骤,科二倒车入库操作步骤高清图解,一步一解读,非常实用!...
- 一文读懂命名实体识别
- Pandas+Numpy 数据中空值的处理操作:判断、查找、填充及删除
- 即第1个字母变成第26个字母,第i个字母变成第26-i+1个字母,非字母字符不变。要求编程序将密码变回原文,并输出密码和原文
- c语言中<< , >>的作用