这是啥?

Comparable是个接口,是一个内部比较器,通常在类定义的时候实现Comparable接口,重写compareTo方法实现排序

怎么用?

与另一篇博客的例子类似,先创建一个lol英雄类Hero。然后按Order顺序排列list。
Hero类在定义时实现Comparable接口

public class Hero implements Comparable<Hero>{private final List<String> order = Arrays.asList("韦恩", "纳尔", "诺手", "乌迪尔");private String name;public Hero(String name){this.name = name;}@Overridepublic int compareTo(Hero o) {// 比较当前实例和o// 找到比较元素的索引,如果o1,o2不在order列表中,indexOf方法返回-1int i1 = order.indexOf(this.name);int i2 = order.indexOf(o.name);i1 = i1 == -1? Integer.MAX_VALUE:i1;i2 = i2 == -1? Integer.MAX_VALUE:i2;return i1-i2;}@Overridepublic String toString() {return this.name;}
}

测试一下

public class test0928 {public static void main(String[] args) {Hero hero1 = new Hero("皎月");Hero hero2 = new Hero("盲僧");Hero hero3 = new Hero("乌迪尔");Hero hero4 = new Hero("纳尔");Hero hero5 = new Hero("瑞兹");Hero hero6 = new Hero("卡萨");Hero hero7 = new Hero("韦恩");Hero hero8 = new Hero("亚托克斯");Hero hero9 = new Hero("奶妈");Hero hero10 = new Hero("诺手");ArrayList<Hero> list = new ArrayList<>();list.add(hero1);list.add(hero2);list.add(hero3);list.add(hero4);list.add(hero5);list.add(hero6);list.add(hero7);list.add(hero8);list.add(hero9);list.add(hero10);System.out.println("排序前");System.out.println(list);Collections.sort(list);System.out.println("排序后");System.out.println(list);}
}

结果如何?

如何理解

首先Collections.sort(list);会调用实现的排序规则,即Hero类中实现的Comparable接口,即重写的compareTo方法。

    @Overridepublic int compareTo(Hero o) {// 比较当前实例和o// 找到比较元素的索引,如果o1,o2不在order列表中,indexOf方法返回-1int i1 = order.indexOf(this.name);int i2 = order.indexOf(o.name);i1 = i1 == -1? Integer.MAX_VALUE:i1;i2 = i2 == -1? Integer.MAX_VALUE:i2;return i1-i2;}

这篇博客的例子其实和这一篇是一样的

Comparable与Comparator对比

  1. 两者都是用来用作对象之间的比较,都可以自定义比较规则;
  2. 两者都是返回一个描述对象之间关系的int;
  3. comparable 在java.lang包下,comparator在java.util包下;
  4. 实现comparable 必然要重写compareTo(T o)方法,实现comparator必然要重写compare(T o1,T o2)方法;
  5. Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
  6. Comparable 在类定义时已经实现,表明这个类具备排序的功能,而Comparator是在类没有实现comparable接口或对实现的排序不能满足需求时在类的外部实现。
  7. 使用Comparable需要修改原先的实体类,而Comparator 不用修改原先的类直接去实现一个新的比较器 ,因此Comparator实际应用更加广泛。

参考博客:
JAVA中Comparable和 Comparator的区别
Java集合Comparable接口的升序、降序解释

Java Comparable的使用相关推荐

  1. Java Comparable接口的陷阱

    Java Comparable接口提供了一种对实现该接口的类进行自然排序的方法. 自然顺序对标量和其他非常简单的对象有意义,但是当我们使用面向业务的领域对象时,自然顺序就变得更加复杂. 从业务经理的角 ...

  2. Java创建comparator对象,Java Comparable 和 Comparator 的详解及区别

    Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. C ...

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

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

  4. java comparable Comparator 区别

    Comparable与Comparator 都是用来实现集合中的排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序, ...

  5. java comparable排序_Java使用Comparable解决排序问题

    本文实例讲述了Java使用Comparable解决排序问题的方法.分享给大家供大家参考.具体实现方法如下: 一次举重竞赛的比赛规则是:选手的成绩以成功举起的总重量来排序,举起总重量多的排在前面:当举起 ...

  6. java comparable接口_Java面试题之Java集合篇三

    Java面试题之Java集合篇三1.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的, ...

  7. java comparable接口作用_Java Comparable 接口

    compareTo()的灵活性 如果我们反复调用上面的compareTo()方法,那么我们可以通过大小来排序,这很棒,但并非故事的结束.如果我们想通过颜色来给苹果排序呢?抑或是重量?我们也可以做到.关 ...

  8. java comparable接口_浅谈程序接口

    · 为什么需要接口?接口和抽象类的区别? 接口就是比"抽象类"还"抽象"的"抽象类",可以更加规范的对子类进行约束.全面地专业地实现了:规范 ...

  9. java Comparable和Comaprator的对比

    Comparable使一个class具备不同实例间进行比较的行为.这些对象的集合,可作为Collections.sort或Arrays.sort的参数 Comparator可以看成一种算法的实现,将算 ...

  10. java comparable null_Java中Comparable和Comparator你知多少?

    前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...

最新文章

  1. 使 WebBrowser 更简单的新加和执行 js, 可安装 jQuery 脚本的 C# 开源代码 - IEBrowser [1]...
  2. 机器学习基础专题:评估指标
  3. 在Vue2.0项目中与H5项目中获取、设置、清除cookie的一些注意点
  4. 为什么转换不了html,特殊字符不会转换为html实体(html_entity_decode不工作)
  5. Leetcode:Palindrome Number
  6. 一个fork的面试题 转
  7. IntersectionObserver API
  8. 浅析JDK,JRE,JVM的区别
  9. 蓝鹰立德的SAP解决方案开启飞马模式(FMEA)
  10. 基于jsp,javaweb的毕业设计管理系统
  11. 二叉树前中后序遍历【非递归】
  12. qq空间登录(采用cookie纪录+广度搜索BFS)
  13. 论文流程图——使用VISIO制作论文中的流程图
  14. 2014校园招聘_华为2014校园招聘
  15. android 自定义圆形进度条拖动样式,android自定义圆形进度条
  16. 常用网站攻击手段及防御方法
  17. 织梦标签全攻略[转]
  18. 谷歌seo外链预算方案,影响谷歌反向链接成本的因素
  19. 如何对用户输入进行校验
  20. 笔记:FPGA与VHDL语言学习2

热门文章

  1. 51单片机+步进电机控制正反转8拍控制+Proteus仿真
  2. 小程序传参中文乱码解决办法
  3. js进阶 12-2 彻底弄懂JS的事件冒泡和事件捕获
  4. mac苹果电脑打开应用程序提示错误的处理方法
  5. C语言统计单链表中的节点数-实训
  6. [源码和文档分享]Qt实现的宠物小精灵对战游戏阶段二-用户的联网注册和登录...
  7. 高级产品经理再往上,至少有5层,你在第几层?
  8. 小点子----校园吃货
  9. linux查看计算机系统软件,如何查询电脑系统版本 怎么查看电脑版本是系统几
  10. Ubuntu下关机命令的区别