Java - Comparable接口和Comparator接口的区别

Java中Comparable和Comparator接口的区别 Comparable 简介 Comparable 是排序接口 若一个类实现了Comparable接口,就意味着“该类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。 接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回... 阅读详情

使用目的

Comparable和Comparator接口都是实现集合中元素的比较、排序的。

对于Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要手动定义比较规则,也就是需要依靠Comparable或者Comparator。

可以把Comparable理解为内部比较器,而Comparator是外部比较器。


Comparable

Comparable接口有且仅有一个方法:public int compareTo(T o); 

Comparable 是一个对象本身就已经支持自比较所需要实现的接口。

如String、Integer自己就实现了Comparable接口,可完成比较大小操作。

如果自定义类要在加入list容器中后能够排序,可以实现Comparable接口,重写compareTo(T o)方法

在用Collections类的sort方法排序时若不指定Comparator,那就需要实现Comparable接口,重写compareTo(T o)方法。
实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

compareTo(T o)方法

该方法将此对象与指定对象进行排序比较。如果此对象小于、等于或大于指定对象,则返回负整数、零或正整数。 

public class Person implements Comparable<Person> {
	String name;
	int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}
	
	@Override
	public int compareTo(Person o) {
		
		return this.age - o.age;
	}
}

import java.util.Arrays;

public class Test {

	public static void main(String[] args) {
		Person p1 = new Person("zhangsan", 20);
		Person p2 = new Person("lisi", 18);
		Person p3 = new Person("wangwu", 25);
		
		Person[] persons = {p1, p2, p3};
		System.out.println("排序前");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
		//Arrays是数组工具类,Collections是集合工具类
		Arrays.sort(persons);
		System.out.println("排序后");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
	}

}

String类重写了实现了Comparable接口重写了compareTo方法:

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}


Comparator

Comparator被称为外部比较器

如果我们需要对某个类A进行排序,但是这个类又不实现Comparable接口并重写方法。

这样的话这个类A自己就没有比较规则了。

这时我们可以另外定义一个实现了Comparator接口的类B,来作为这个没有比较规则的类A的“比较器”。这个“比较器”只需要实现Comparator接口即可。

实现了Comparator接口的类B(比较器),要实现compare(T o1, T o2)方法,该方法中就是我们自定义的对类A进行比较的规则 
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

public class Person {
	String name;
	int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}
}
import java.util.Comparator;

public class PersonComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		return o1.age - o2.age;
	}
	
}
import java.util.Arrays;

public class Test {

	public static void main(String[] args) {
		Person p1 = new Person("zhangsan", 20);
		Person p2 = new Person("lisi", 18);
		Person p3 = new Person("wangwu", 25);
		
		Person[] persons = {p1, p2, p3};
		System.out.println("排序前");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
		
		Arrays.sort(persons, new PersonComparator());
		System.out.println("排序后");
		for (Person person : persons) {
			System.out.println(person.name + ":" + person.age);
		}
	}
}


总结

Comparable和Comparator都可以用来帮助类进行比较、排序。

Comparable可以直接在需要进行排序的类中实现,重写compateTo(T o)方法

而Comparator需要另外定一个实现Comparator接口的实现类来作为“比较器”

用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。

用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑

倒立摆入门详解+pid调参 倒立摆制作全过程 最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。 首先给你们看看我的成果 注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。 材料准备 1.机械部分 如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。 2.主控部分 这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件 阅读详情

相关推荐

无线网卡选购指南:哪些型号支持Kali Linux的监听模式?附免驱动网卡推荐

本文详细解析了如何在Kali Linux下选购支持监听模式的无线网卡。核心在于选择兼容的芯片组,如Atheros AR9271和Ralink RT3070等经典型号,并提供了免驱动网卡推荐与实战配置指南,帮助安全研究人员和爱好者快速搭建无线测试环境。

wind6的博客 1555

JAVA-compareTo

一.java中的compareto方法 1.返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值 String a1 = “a”; String a2 = “c”; System.out.println(a1.compareTo(a2));//结果为-2 2.即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的...

weixin_46223893的博客 3371

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

m0_52031708的博客 3844

9-4Java常用类----Java比较器

9-4Java常用类----Java比较器 一、说明:Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。如何实现?使用两个接口中的任何一个:Comparable 或 Comparator ----》Java实现对象排序的方式有两种:  (1)自然排序:java.lang.Comparable  (2)定制排序:java.util.Comparator 二、Comparable

wp_886的博客 304

避开这些坑!QMT多因子策略实盘中的5个常见错误及解决方案

本文深入剖析了在QMT平台上实施多因子策略时常见的5个错误,包括因子过拟合、数据延迟处理不当、因子失效、交易成本低估和风险控制缺失,并提供了实用的解决方案。通过优化因子筛选、数据对齐和动态管理,帮助量化交易者提升策略稳健性和实盘表现。

k5l6m的博客 238

【多媒体交互】Unity+普通摄像头实现UI事件分析

利用摄像头捕捉用户的手势或动作,结合坐标映射与事件系统触发UI交互

qq_38350004的博客 1315

java double.compare_Java Comparator comparingDouble()用法及代码示例

Java中Comparator接口的compareDouble(java.util.function.ToDoubleFunction)方法接受一个函数作为参数,该参数从类型T中提取一个双精度排序键,并返回一个与该排序键进行比较的Comparator。指定的函数也可以序列化。用法:static Comparator comparingDouble(ToDoubleFunction keyExt...

weixin_36370242的博客 2179

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1173

Comparable接口中compareTo用法

compareTo就是比较两个值,如果前者大于后者,返回1,等于返回0,小于返回-1,我下面给出了例子,由于比较的变量我用的是int,int型可以直接比较,所有没有用到compareTo比较,如果声明的是Date、String、Integer或者其他的,可以直接使用compareTo比较, public int compareTo(TestModel1 o) { return this

弯弯专栏 7975

Cadence公司的数字IC设计工具:综合工具(Genus)——(2)

介绍Cadence公司的数字IC设计工具Genus

qq_42922513的博客 1943

基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

一、环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解) 硬件包含: 淘宝购买的完整一套4轮遥控小车(采用STM32F103ZET6作为主控板)、DHT11温湿度传感器、中科微GPS模块、ESP8266 ...

6万+

java的Comparator接口详解

前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法。实际上Java中除了比较一个接口外,还提供了一个接口,该接口也是具有比较的功能,但该接口注重的却是比较容器,然后对其排序,这就是Comparator,下面我们就来具体认识一下; 首先看一下源码: package java.util; import java....

霓虹深处 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

详解Java中Comparable和Comparator接口的区别

Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。 接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返...

牵着蜗牛_去散步 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java中Comparator 和 Comparable 接口的区别

Java中Comparator 和 Comparable 接口的区别

m0_50742275的博客 1023

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java中Comparable和Comparator接口的区别(看完这篇别再分不清了!)

各位老铁们(敲黑板),咱们程序员在日常开发中是不是经常遇到这样的场景:给对象列表排序时,突然发现方法报错了?或者想实现多种排序方式时,代码越写越乱?今天咱们就来盘一盘Java中两大排序神器——Comparable和Comparator的区别!这个接口就像给对象打上的"胎记"(划重点),实现了它的类就天生具备排序能力。@Override// 按分数降序排列这个接口就像个"外挂",可以在不修改原有类的情况下,给对象添加多种排序方式。// 按姓名排序// 按年龄升序。

cloudcruiser的博客 1907

java中Comparator和Comparable接口区别分析

/** *@ author StormMaybin *@ date 2016-10-01 */ 生命不息,奋斗不止! 首先,Comparator和Comparable都是接口,具有共同的功能,对于一个实体类进行排序的功能。 Comparator简介      强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collect

StormMaybin的博客 2438

Java 中Comparator 和 Comparable接口的区别

Java 中Comparator 和 Comparable接口的区别

weixin_42320587的博客 703

Java中Comparable和Comparator接口的区别:看完这篇别再傻傻分不清了!

各位Javaer应该都遇到过这样的场景(拍大腿)——你写了个Employee员工类,现在需要按工资排序。这时候你发现Java集合框架的Collections.sort()根本不买账!Comparable和Comparator。(敲黑板)这俩兄弟长得像双胞胎,但性格迥异!今天就带大家扒一扒它们的底裤,保准你下次用的时候不再犯选择困难症!Comparator.nullsFirst(Comparator.naturalOrder()) // null排最前。

2509_91393034的博客 1153

java comparable与_详解Java中Comparable和Comparator接口的区别

详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧。Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排...

weixin_34987986的博客 534

Java中Comparable接口与Comparator接口的区别

一、 Java的命名规则讲究“见名知意”,compare(比较、对比)这个词我们非常熟悉,那么也基本知道Comparable接口与Comparator接口是干嘛的啦,其作用就是比较,这样可以方便对数组、集合类进行排序。因为可以直接调用Arrays.sort(数组)方法或Collections.sort(集合类)方法,而且通过翻看源码,我们发现这两个方法的底层实现确实是基于Comparable接口与Comparator接口的。 不同点: 1.接口中规定的方法不同 Comparable接口中是:public i

dabusiGin的博客 525

java 实现Comparable接口和实现Comparator接口排序的区别

这取决于Collections.sort()方法是否传入了自定义Comparator排序规则,如果传入了自定义Comparator排序规则那以Comparator为准否则以Comparable为准。

weixin_40323532的博客 1529

Java基础篇 —Comparable接口与Comparator接口的使用及区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言概念 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了.

m0_63330888的博客 1807

Java中Comparator接口与Comparable接口区别

Java中Comparator接口与Comparable接口引用头文件区别comparable调用Comparator方法调用总结 引用头文件 Comparator位于包java.util下,而Comparable位于包 java.lang下 区别 Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的...

敌人派的博客 385

Java中Comparable和Comparator接口区别分析

Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。 此外,“实现Compar

qq_29631069的博客 405

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

详解Java中Comparable和Comparator接口的区别发布于 2020-7-20|复制链接摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧。Comparable 简介 ..详解Java中Comparab...

weixin_34652034的博客 177

java比较器Comparable接口和Comparator接口之间区别

java的比较器有两类,分别是Comparable接口和Comparator接口。在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口。让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用或者Collections.sort来排序对象数组,实例如下:import java.io.Serial...

随风而来的温柔 756
上一篇: Java - SpringBoot借助Java Mail Sender(基于javax/jakarta.mail)发邮件
下一篇: Java - 泛型的通配符
「已注销」
博客等级 码龄5年 413粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值