Java 中 Comparable 接口的意义和用法.
在之前的博文中已经介绍了Java中Collection 接口和 Collections类.
http://blog.csdn.net/nvd11/article/details/21516075
一, 为何需要实现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个要重写的关键的方法.
就是
int compareTo(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 中 Comparable 接口的意义和用法
一, 为何需要实现Comparable接口 我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 当然, 其中最长用的莫过于排序了(Collections ...
- 12 java中instanceof运算符的意义和用法
java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...
- Java中Comparable接口和Comparator接口怎么用?
Java比较器 文章目录 Java比较器 Comparable接口(自然排序) Comparator接口(定制排序) 引文:Java中的对象,正常情况下是不可以用>和<去比较的,只能使用不 ...
- Java中Comparable接口与Comparator接口
Comparable:内部比较器,进行排序的元素必须要实现该接口并重写里面的compareTo方法 Comparator:外部比较器,可以使用一个新类(匿名内部类.比较器实现类)来实现该接口,指定传入 ...
- Java中Comparable和Comparator接口区别分析
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
- JAVA中常用接口的介绍及使用示例 java lang Comparable
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...
- Java中的接口命名[关闭]
本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...
- 简单介绍Java中Comparable和Comparator
转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...
最新文章
- cf两边黑屏怎么解决win10_Win10电脑开机黑屏只有鼠标指针无法进入桌面的解决方法...
- 【正一专栏】瓜迪奥拉就是一座无可匹及的丰碑
- POST中文乱码解决方案
- linux网口驱动实现(待续)
- VIP - virtual IP address
- Linux 文件系统之 inode 概述
- day2 字典常用的方法
- Xilinx PLL IP核功能仿真
- java课设迷宫游戏_Java课程设计走迷宫.doc
- java对接快递鸟单号查询自动识别api接口,调用代码示例
- 使用CNN进行情感分析(Sentiment Analysis)
- python|爬虫东宫小说
- 如何升级展锐RM500U模组的5GCPE固件
- 拉钩作业:Bikeshare数据集 预测共享单车骑行量
- 可解释的机器学习,用于科学的见解和发现(Explainable Machine Learning for Scientific Insights and Discoveries)
- UML建模——活动图(Activity Diagram)
- ROS学习----依据ROS入门教程,整理的ROS命令
- 使用alwayson后如何收缩数据库日志
- 手机电路板文件_三轮制裁后,华为手机业务还能不能继续?“胡杨”就是答案...
- 实施工程师的必备技能