在之前的博文中已经介绍了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 接口的意义和用法.相关推荐

  1. java comparable接口作用_Java 中 Comparable 接口的意义和用法

    一, 为何需要实现Comparable接口 我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 当然, 其中最长用的莫过于排序了(Collections ...

  2. 12 java中instanceof运算符的意义和用法

    java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...

  3. Java中Comparable接口和Comparator接口怎么用?

    Java比较器 文章目录 Java比较器 Comparable接口(自然排序) Comparator接口(定制排序) 引文:Java中的对象,正常情况下是不可以用>和<去比较的,只能使用不 ...

  4. Java中Comparable接口与Comparator接口

    Comparable:内部比较器,进行排序的元素必须要实现该接口并重写里面的compareTo方法 Comparator:外部比较器,可以使用一个新类(匿名内部类.比较器实现类)来实现该接口,指定传入 ...

  5. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

  6. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  7. JAVA中常用接口的介绍及使用示例 java lang Comparable

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...

  8. Java中的接口命名[关闭]

    本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...

  9. 简单介绍Java中Comparable和Comparator

    转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...

最新文章

  1. cf两边黑屏怎么解决win10_Win10电脑开机黑屏只有鼠标指针无法进入桌面的解决方法...
  2. 【正一专栏】瓜迪奥拉就是一座无可匹及的丰碑
  3. POST中文乱码解决方案
  4. linux网口驱动实现(待续)
  5. VIP - virtual IP address
  6. Linux 文件系统之 inode 概述
  7. day2 字典常用的方法
  8. Xilinx PLL IP核功能仿真
  9. java课设迷宫游戏_Java课程设计走迷宫.doc
  10. java对接快递鸟单号查询自动识别api接口,调用代码示例
  11. 使用CNN进行情感分析(Sentiment Analysis)
  12. python|爬虫东宫小说
  13. 如何升级展锐RM500U模组的5GCPE固件
  14. 拉钩作业:Bikeshare数据集 预测共享单车骑行量
  15. 可解释的机器学习,用于科学的见解和发现(Explainable Machine Learning for Scientific Insights and Discoveries)
  16. UML建模——活动图(Activity Diagram)
  17. ROS学习----依据ROS入门教程,整理的ROS命令
  18. 使用alwayson后如何收缩数据库日志
  19. 手机电路板文件_三轮制裁后,华为手机业务还能不能继续?“胡杨”就是答案...
  20. 实施工程师的必备技能

热门文章

  1. 【Opencv实战】入门也能学会的「黑白上色」教程与手法核心~(收藏不谢)
  2. 【Flask】ORM多对多关联关系
  3. 常见的上传绕过以及解析漏洞
  4. WIN32 窗口枚举和操作
  5. Kibana远程代码执行漏洞攻击方法和漏洞原理分析
  6. 恶意代码实战Lab13-01分析
  7. MySQL知识点复习
  8. 超详细!各种内部排序算法的比较
  9. HDU2032杨辉三角(C++)
  10. 1101 Quick Sort (25 分)【难度: 一般 / 知识点: 快排】