Comparable与Comparator的区别

【0】README

0.1)本文章节一(除开 Conclusion内容)转自: http://blog.csdn.net/mageshuai/article/details/3849143
0.2) 余下内容均为原创,包括源代码;


【1】Comparable与Comparator的区别(Difference)

D1)Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序:

  • Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法;

D2)Comparable 和 Comparator 位于的包不同

  • Comparator位于包java.util下,而Comparable位于包 java.lang下;

D3) 一些类(String+Integer)本身就实现了Comparable, 自定义的类要加入List or Set 也要实现 Comparable接口

  • D3.1) Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)
  • D3.2)自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说:
    Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
    这里的自然顺序就是实现Comparable接口设定的排序方式。

D4)Comparator 是专用比较器,用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

  • D4.1)而 Comparator 是一个专用的比较器:当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。
  • D4.2)比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

D5) Comparator定义了俩个方法:

  • D5.1)分别是 int compare(T o1, T o2)和 boolean equals(Object obj),用于比较两个Comparator是否相等

true only if the specified object is also a comparator and it imposes the same ordering as this comparator.

  • D5.2)有时在实现Comparator接口时,并没有实现equals方法,可程序并没有报错,原因是实现该接口的类也是Object类的子类,而Object类已经实现了equals方法

D6) Comparable接口只提供了 int compareTo(T o)方法:也就是说假如我定义了一个Person类,这个类实现了 Comparable接口;

  • D6.1)那么当我实例化Person类的person1后,我想比较person1和一个现有的Person对象person2的大小时,我就可以这样来调用:
person1.comparTo(person2),通过返回值就可以判断了;
  • D6.2)而此时如果你定义了一个 PersonComparator(实现了Comparator接口)的话,那你就可以这样:
PersonComparator   comparator=   new   PersonComparator();
comparator.compare(person1,person2);

D7)Comparator 和 Comparable 定义 比较方法的不同:

  • Comparator 接口定义的是 compare 方法, 而Comparable接口定义的是 compareTo 方法;

Conclusion) 当一个对象想要比较大小进行排序的时候,那么问题来了? 我们有两种方法实现(Implementation): (我心中的干货)

  • I1)改变该类的结构来实现: 也即 要进行比较的对象所属类 实现 Comparable接口,重写方法 compareTo();(涉及到 Comparable.compareTo()方法)
  • I2)不改变该类的结果来实现: 通过添加比较器 Comparator接口,通常的做法是 将 比较器接口 作为匿名内部类传递给 集合构造器,即可。然后在匿名内部类中重写 compare()方法; (涉及到 Comparator.compare()方法)

【2】看个荔枝:

  • you can also visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/TreeSetTest.java
package com.corejava.chapter13;import java.util.*;import static java.lang.System.*;public class TreeSetTest
{  public static void main(String[] args){  Object obj;SortedSet<MyItem> parts = new TreeSet<>();parts.add(new MyItem("B", 1234));parts.add(new MyItem("D", 4562));parts.add(new MyItem("A", 9912));System.out.println("set sorted by part num:");System.out.println(parts);SortedSet<MyItem> set = new TreeSet<>(newComparator<MyItem>() //将比较器Comparator 作为匿名内部类传递给集Set 构造器{  public int compare(MyItem a, MyItem b){  String descrA = a.getDescription();String descrB = b.getDescription();return descrA.compareTo(descrB);}});set.addAll(parts);System.out.println("set sorted by desc :");System.out.println(set);}
}class MyItem implements Comparable<MyItem>
{private String description;private int partNumber;public MyItem(String aDescription, int aPartNumber){description = aDescription;partNumber = aPartNumber;}// ordered by partNumberpublic int compareTo(MyItem other){return Integer.compare(partNumber, other.partNumber);}public String getDescription(){return description;}public String toString(){return "[desc = " + description + ", num = " + partNumber + "]";}public boolean equals(Object otherObject){if (this == otherObject) return true;if (otherObject == null) return false;if (getClass() != otherObject.getClass()) return false;MyItem other = (MyItem) otherObject;return Objects.equals(description, other.description) && partNumber == other.partNumber;}public static void main1(String[] args){Object obj;SortedSet<String> set = new TreeSet<>();set.add("bob");set.add("car");set.add("amy");for (String str : set)out.print(str + " ");}
}

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaFX之TableView的MenuButton

MenuButton 在JavaFx的 TableView 上可以使用MenuButton来管理TableView的Column. 启用MenuButton. TableView.setTableMenuButtonVisible(true); 但是普通的MenuButton, 每次点击都会刷新TableView 重写TableMenuButton的事件 [java] view plaincopy 找到tableView 的 …

java 读取 文本块_Java 13:文本块

java 读取 文本块Java 13已交付了期待已久的多行字符串或Text Blocks 。 您不再需要连接跨越多行的字符串或转义特殊字符&#xff0c;这确实提高了代码的可读性。 文本块是一种预览语言功能 &#xff0c;这意味着必须使用--enable-preview标志在Java编译器和运行时中明确启用它…

php 崩溃 输出,php – 创建可崩溃的print_r()var_dump()的函数?

你可能熟悉print_r的这个输出&#xff1a;Hierarchy Object([parent:private] > Hierarchy Object([parent:private] >[children:private] > Array()[level:private] > 0[price_modes:private] > Array()[id:protected] >[left_id:protected] >[right_id:…

JavaFX之TableView的SelectionMode

SelectionMode table默认是只能选着一行的&#xff0c;如果想选着多行&#xff0c;设置SelectionMode,此时可以对选中的多个进行监听。 [java] view plaincopy ListChangeListener<Person> indicesListener new ListChangeListener<Person>() { …

Comparable and Comparator API

【0】README 0.1&#xff09;文本全文翻译于 java 8 JDK 官方文档中关于 Comparable and Comparator 的描述&#xff1b; 0.2&#xff09;能力有限&#xff0c;仅供参考&#xff1b; 【1】 Interface Comparable 1.0&#xff09;类型参数&#xff1a; 与本对象进行比较的另一…

sql2008 sql服务_SQL即服务

sql2008 sql服务自2007年以来&#xff0c;我一直在考虑这一点&#xff0c;大约在Amazon 推出 S3时。 我什至尝试实现了几次&#xff0c;但是在设计阶段之后就失败了。 我听说过一家初创公司也尝试这样做&#xff0c;但也失败了 。 我仍然不确定是否可以这样做&#xff0c;但是它…

dede rss.php,DeDeCMS dede 织梦cms RSS全站静态输出的实现方法

DedeCMS自带Rss功能&#xff0c;在管理后台可以生成出一个Rss地图页面&#xff0c;默认是/data/rssmap.html&#xff1b;这个Html地图文件会告知用户每个栏目的rss订阅地址&#xff0c;这个功能很适合栏目及文章较多的网站&#xff0c;但不太适合文章页不多的小型站点&#xff…

java之注解

注解使用一、java的常用注解 Override 重写覆盖方法 SuppressWarnings 压住警告可用于类和方法 Deprecated 声明类或方法过时 注解Override用在方法上&#xff0c;当我们想重写一个方法时&#xff0c;在方法上加Overr…

java集合——队列和双端队列+优先级队列

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——队列和双端队列优先级队列 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-j…

java无效的源发行版_无效的Java

java无效的源发行版也许我可以被机器人代替进行代码审查。 有一些反馈我发现自己一遍又一遍。 这是我最不喜欢的一些&#xff1a; 通用代码结构 放弃其他 当if在两端return的else是多余的和不必要的创建缩进。 if (foo) { return bar; } else { return baz; } // should be…

oracle数值型转为char类型,PLSQL: Oracle函数to_char转化数字型指定小数点位数的技巧...

问题题出&#xff1a; 数字0.023 > 转化成字符串"0.023"问题难点&#xff1a;to_char&#xff0c;函数功能&#xff0c;就是将数值型或者日期型转化为字符型。比如最简单的应用&#xff1a;Select TO_CHAR(1.0123) FROM DUALSelect TO_CHAR(123) …

java之常用方法

一、数学函数 在System.Math类里面的函数 I、三角函数 sin(radians) 正弦函数 cos(radians) 余弦函数 tan(radians) 正切函数 toRadians(degree) 角度转为弧度 toDegree(radians) 弧度转为角度 asin(a) 反正弦函数 acos(a)…

java集合——映射表+专用集合映射表类

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——映射表专用集合映射表类 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-jav…

jstat分析_jstat –分析

jstat分析jstat是一个简单的实用工具&#xff0c;在JDK中存在&#xff0c;用于提供与JVM性能相关的统计信息&#xff0c;例如垃圾收集&#xff0c;编译活动。 jstat的主要优势在于&#xff0c;它可以在运行JVM且无需任何先决条件的情况下动态捕获这些指标。 这是什么意思&#…

oracle中execute函数,oracle Execute Immediate(sql语句)

慕尼黑的夜晚无繁华Example 1:Output:ABCDECLARE TYPE var_typ IS TABLE OF VARCHAR2(4000);cVars var_typ;cVar VARCHAR2(4000);BEGINEXECUTE IMMEDIATE SELECT A cc FROM dualUNIONSELECT B cc FROM dualUNIONSELECT C cc FROM dual BULK COLLECT INTO cVars; FOR i IN 1 .…

java之数组

一、声明数组 数组是引用类型&#xff0c;声明数组并没有分配空间&#xff0c;则该数组变量的值为null。 类型[] 数组名; 如&#xff1a;double[] data; 二、创建数组 类型[] 数组名new 类型[长度]; 数组创建&#xff0c;数组里面的元素会被赋值&#xff0c;数值型基本数据…

java集合——集合框架

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——集合框架 的相关知识&#xff1b; 【1】集合框架 1.1&#xff09; java集合类库构成了集合类的矿建&#xff0c; 它为集合的实现者定义了大量的接口…

oracle密码不能重复用_重复码

oracle密码不能重复用介绍 在我们的Java应用程序中复制/粘贴代码通常不好&#xff0c;但是有时这是不可避免的。 例如&#xff0c;项目License3j在Feature类中为其支持的每种XXX类型提供了一个isXXX方法。 在这种情况下&#xff0c;我们做不到写 public boolean isBinary() { r…

oracle rman 用户,对Oracle数据库进行RMAN备份的Oracle数据库用户权限

在Oracle 12版本或者更高版本&#xff0c;Oracle备份用户需要具有SYSDBA或者SYSBACKUP权限在Oracle 11(包括11版本)以前&#xff0c;Oracle备份用户需要具有SYSDBA权限创建及授权用户权限命令示例如下&#xff1a;SQL>create user backupuser identified by oracle;SQL>g…

java之类

一、构造方法1)构造方法具有与类的相同名字2)构造方法没有返回值&#xff0c;甚至连void都没有3)创建新对象使用new&#xff0c;构造方法的作用就是初始化对象。格式为&#xff1a; [可见修饰符] 类名(参数表){}例如&#xff1a;public Myclass(){}普通方法&#xff1a; p…