Comparable和Comparator的区别

马蜂窝一面:Comparable和Comparator有什么区别? 那天,小二去马蜂窝面试,面试官老王一上来就甩给了他一道面试题:请问Comparable和Comparator有什么区别?小二差点笑出声,因为三年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上看到过这题????。 PS:为了能够帮助更多的 Java 初学者,已将《Java 程序员进阶之路》开源到了 GitHub(本篇已收录)。该专栏目前已经收获了 580 枚星标,如果你也喜欢这个专栏,觉得有帮助的话,可以去点个 star,这样也方便以后进行更系统化的学习! CodeChina 直达地址:ht 阅读详情

**

Comparable是什么?

**
java.lang
Interface Comparable

参数类型
T - 可以将此对象与之进行比较的对象类型

**public interface Comparable**该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。
Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。 实现该接口的对象,可以使用如在键sorted map或作为在元件sorted set ,而不需要指定一个comparator 。

一类C的自然顺序被说成是与equals一致当且仅当e1.compareTo(e2) == 0对每一个e1和C类e2相同的布尔值e1.equals(e2)。 请注意, null不是任何类的实例, e.compareTo(null)应该抛出一个NullPointerException即使e.equals(null)返回false 。

强烈建议(尽管不需要)自然排序与等于一致。 这是因为,当没有显式比较器的排序集(和排序映射)与其自然排序与equals不一致的元素(或键)一起使用时会“奇怪地”。 特别地,这种排序集合(或排序映射)违反了根据equals方法定义的集合(或映射)的一般合同。

实现该接口需要覆盖compare方法
int compareTo(T o)将此对象与指定的对象进行比较以进行排序。 返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。
实现程序必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有x和y。 (这意味着x.compareTo(y)必须抛出异常iff y.compareTo(x)引发异常。)

实施者还必须确保关系是可传递的: (x.compareTo(y)>0 && y.compareTo(z)>0)表示x.compareTo(z)>0 。

最后,实施者必须确保x.compareTo(y)==0意味着sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,对于所有z 。

强烈建议,但不要严格要求(x.compareTo(y)==0) == (x.equals(y)) 。 一般来说,任何实现Comparable接口并违反这种情况的类应清楚地表明这一点。 推荐的语言是“注意:此类具有与equals不一致的自然排序”。

在前面的描述中,符号sgn( ) 表达式表示数学符号函数,其定义根据表达式的值是否为负,零或正返回的-1一个,0,或1。

覆盖方法

int compareTo(T o)
将此对象与指定的对象进行比较以进行排序。
返回负整数,零或正整数,因为该对象小于,等于或大于指定对象。
异常
NullPointerException - 如果指定的对象为空
ClassCastException - 如果指定的对象的类型阻止它与该对象进行比较。

简单使用:

Person.java

package com.passer._1214;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Comparable<Person>{
	
	private Long id;
	private String name;

	@Override
	public int compareTo(Person p) {
		return id.compareTo( p.getId() );
	}
}

ComparableTest.java

package com.passer._1214;

import java.util.Arrays;

import org.junit.Test;

public class ComparableTest {
	
	@Test
	public void testComparable() throws Exception {
		Person p1 = new Person(2L,"passer");
		Person p2 = new Person(1L,"will");
		Person p3 = new Person(3L,"kill");
		
		Person [] ps = new Person[] {p1,p2,p3}; 
		Arrays.sort(ps);
		
		for (Person person : ps) {
			System.out.println(person);
		}
	}
	
}

Comparator是什么?

java.util
Interface Comparator

参数类型
T - 可比较此比较器的对象类型
**public interface Comparator**比较功能,对一些对象的集合施加了一个整体排序 。 可以将比较器传递给排序方法(如Collections.sort或Arrays.sort ),以便对排序顺序进行精确控制。 比较器还可以用来控制某些数据结构(如顺序sorted sets或sorted maps ),或对于不具有对象的集合提供的排序natural ordering 。
通过比较c上的一组元素S的确定的顺序对被认为是与equals一致当且仅当c.compare(e1, e2)==0具有用于S每e1和e2相同布尔值e1.equals(e2)。

当使用能够强制排序不一致的比较器时,应注意使用排序集(或排序图)。 假设具有显式比较器c的排序集(或排序映射)与从集合S中绘制的元素(或键) 一起使用 。 如果88446235254451上的c强制的排序与equals不一致,则排序集(或排序映射)将表现为“奇怪”。 特别是排序集(或排序图)将违反用于设置(或映射)的一般合同,其按equals定义。

例如,假设一个将两个元件a和b ,使得(a.equals(b) && c.compare(a, b) != 0)到空TreeSet与比较c 。 因为a和b与树集的角度不相等,所以第二个add操作将返回true(并且树集的大小将增加),即使这与Set.add方法的规范相反。

注意:这通常是一个好主意比较,也能实现java.io.Serializable,因为它们可能被用来作为排序的序列化数据结构的方法(如TreeSet , TreeMap )。 为了使数据结构成功序列化,比较器(如果提供)必须实现Serializable 。

对于数学上的倾斜,即限定了施加顺序 ,给定的比较器c上一组给定对象的S强加关系式为:

{(x, y) such that c.compare(x, y) <= 0}. 这个总订单的商是:
{(x, y) such that c.compare(x, y) == 0}. 它从合同compare,该商数是S的等价关系紧随其后,而强加的排序是S, 总订单 。 当我们说S上的c所规定的顺序与等于一致时,我们的意思是排序的商是由对象’ equals(Object)方法定义的等价关系:
{(x, y) such that x.equals(y)}. 与Comparable不同,比较器可以可选地允许比较空参数,同时保持对等价关系的要求。

覆盖方法

int compare(T o1, T o2)
比较其两个参数的顺序。

简单使用:

package com.passer._1214;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import org.junit.Test;

public class ComparatorTest {
	
	@Test
	public void testComparator() throws Exception {
		
		Person p1 = new Person(2L,"passer");
		Person p2 = new Person(1L,"will");
		Person p3 = new Person(3L,"kill");
		List<Person> list = Arrays.asList(p1,p2,p3);	
			
		list.sort(new Comparator<Person>() {
			@Override
			public int compare(Person o1, Person o2) {
				return o1.getId().compareTo(o2.getId());
			}
		});
	}
}
[原创]Linux 802.11n CSI tool Monitor模式 Linux 802.11n CSI tool Monitor模式 使用AP模式的缺陷在于ping 命令速度比较慢,且不能精确控制发送的参数,比如接收的包数量是不可控的。Monitor模式可以调制发送速率、发包数量、发送天线个数、HT模式、short/long guard interval等等,因此调通Monitor模式是必须的。期间参考了博主沃一德的CSI Tool安装使用讲解,对他的工作表示感... 阅读详情

相关推荐

SAP固定资产原值与净值取值逻辑全解析:从数据表到ABAP实战

在企业资源计划(ERP)系统中,固定资产的价值管理是财务会计的核心模块,其关键在于准确核算资产原值与净值。从技术原理上看,这涉及对资产全生命周期业务(如购置、折旧、转移、报废)的财务建模,以及底层数据表(如ANLC、ANEP)的精准关联与计算。掌握这一逻辑的技术价值在于,能够确保财务报表数据的准确性,满足合规性要求,并为管理决策提供可靠依据。在SAP ECC或S/4HANA系统的应用场景中,ABAP开发者与财务顾问常需通过编写报表程序,从复杂的数据结构中提取资产价值信息。本文聚焦于SAP资产会计模块,深入剖

weixin_30984001的博客 392

Comparable和Comparator的 区别

一、概述: 对一组数据进行排序(升序或降序),在Java中有很多方式,可以自己手写排序算法(冒泡、快速、二叉树排序等),但一般都采用JDK为我们提供的现有的2个接口,Comparable和Comparator。 二、相同点: 两者都是用来用作对象之间的比较,都可以自定义比较规则。 两者都是返回一个描述对象之间关系的int。 三、区别: Comparable是java.lang包下的,Comparator是java.util包的。 实现Comparable必须重写compareTo(T o),实现Com

FaizOrange的博客 1841

主流双目相机技术参数横向评测:从ZED到INDEMIND的深度解析

本文对主流双目相机进行了深度横向评测,涵盖ZED、Bumblebee、Leap Motion、DUO 3D及INDEMIND等国内外产品。文章详细解析了分辨率、帧率、视场角、基线等核心参数,并结合科研、机器人导航、无人机、工业检测等典型应用场景,提供了实战选型指南,帮助读者根据具体需求挑选最合适的双目视觉解决方案。

weixin_29212867的博客 640

Comparator和Comparable的区别

文章目录 一、概述 二、Comparable 三、Comparator 四、Comparator和Comparable的区别 五、实现方式 一、概述   Comparable和Comparator都是两个接口,接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而Comparator既可以嵌入到自身类中,也可以在一个独立的

m0_71087031的博客 1万+

UE4逆向实战:如何快速定位UWorld和GName的5种实用技巧(含版本差异分析)

本文详细介绍了UE4逆向工程中快速定位UWorld和GName的5种实用技巧,包括特征码定位法、动态行为分析法、静态符号分析法等,并针对不同版本差异提供了适配方案。特别强调了UWorld作为游戏世界核心容器和GName作为名称管理系统的重要性,帮助开发者高效进行游戏逆向分析。

star的博客 895

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 247

Java中Comparable和Comparator详解

Java中Comparable和Comparator详解1 Comparable接口Comparable小结2 Comparator接口Comparator小结3 Comparable和Comparator比较 1 Comparable接口 将Comparable源码中的所有注释去掉后,代码如下: package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T

Joyji99的博客 1204

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

Comparable和Comparator区别

Comparable:内部比较器,必须在类上实现该接口通过固定字段进行比较;Comparator:是外部比较器,在方法中通过lambda表达式实现接口就可以了。:Comparable重写方法compareTo(T o);Comparator重写方法compare(T o1, T o2):一个参数,默认是Comparable自然排序,二个参数,需要传入Comparator外部排序。:Comparable唯一字段排序,Comparator可以有多个字段排序。:都是用于比较排序。

qq_64847107的博客 1053

stable-diffusion-webui的逐步部署教程

本文主要介绍了stable-diffusion-webui的逐步部署教程,希望能对使用Stable Diffusion的同学们有所帮助。 文章目录 1. 前言 2. 逐步部署教程 2.1 创建Python环境 2.2 安装依赖库 2.3 运行代码

weixin_43178406的博客 6万+

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 9982

Comparator与Comparable有什么区别

接口位于java.lang包下,它定义在需要排序的对象类的内部,表明该类的实例自身具有比较性,即“该对象是可比较的”。当你需要在多个维度或标准上对对象进行排序,或者需要临时改变排序逻辑时(例如,学生既可以根据年龄排序,也可以根据成绩排序),使用。:接口同样位于java.lang包下,它是一个外部比较器,不需修改原有类的代码,就可以定义两个对象的比较规则。当你需要对一个类的实例进行排序,并且这种排序规则是该类的固有属性(例如,按学生年龄排序),那么实现。方法,可以自定义比较逻辑,决定两个对象的大小关系。

qq_36419801的博客 431

使用cutoff包基于最小p值法方法计算最佳截断值(基于LIRI基因数据集) R语言

这个方法在生物学研究中具有重要的意义,能够帮助我们从大规模基因表达数据中准确地找到差异显著的基因。在上述代码中,calculate_p_values函数是一个自定义函数,用于计算差异表达基因的p值。在本文中,我们将介绍如何使用R语言的cutoff包来基于最小p值法方法计算最佳的截断值,以便筛选出差异显著的基因。通过以上步骤,我们成功地使用cutoff包基于最小p值法方法计算了最佳的截断值,并筛选出了差异显著的基因。最后,我们可以根据得到的最佳截断值将基因表达数据集进行筛选,提取出差异显著的基因。

ByteKnight的博客 1291

浅析 Comparable和 Comparator的区别

简介 Comparable和 Comparator都是java.util包下的两个接口,从字面上看这两个接口都是用来做比较用的,但是jdk里面不可能定义两个功能相同的接口,所以他们肯定有不同的用处。 1、Comparable 1.1 说明 Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些 类是可以和自己比较的,至于具体和另一个实现了Compar...

wlh2015的博客 3万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Comparable 和 Comparator 接口的区别

在Java中,Comparable 和 Comparator 两个接口经常用于对象排序。然而,它们在使用场景和实现细节上存在显著的区别。本文将详细介绍这两个接口的主要区别以及它们各自的作用。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7010

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Comparable与Comparator的区别

 Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。Comparator位于包java.util下,而Comparable位于包  

小帅的专栏 6万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Comparable和Comparator的用法和区别

comparable是个接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序

weixin_73869209的博客 2614

java中Comparable和Comparator的区别

文章目录简介ComparableComparator举个例子 java中Comparable和Comparator的区别 简介 java.lang.Comparable和java.util.Comparator是两个容易混淆的接口,两者都带有比较的意思,那么两个接口到底有什么区别,分别在什么情况下使用呢? Comparable Comparable是java.lang包下面的接口,lang包下面可...

程序那些事 9560

JAVA中Comparable和 Comparator的区别

JAVA中的Comparable 和 Comparator

Yusean_L的博客 3434

comparator和comparable的区别

前言: comparator和comparable都是用来实现集合中元素的排序比较的。Comparator位于包java.util下,而Comparable位于包java.lang下。他们之间的区别在于用法上。Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。Comparable 是一个对象本身就已经支...

awake_lqh的博客 4046

排序Comparable 和 Comparator的区别

compareTo 方法接收的参数 p 是要对比的对象,排序规则是用当前对象和要对比的对象进行比较,然后返回一个 int 类型的值。然而这个时候,老板有一个需求:需要根据 Person 对象的年龄 age 属性进行倒序,也就是根据 age 属性从大到小进行排序,这个时候就可以请出,我们本文的主角:Comparable 出场了。从上图可以看出,当自定义类 Person 没有实现 Comparable 时,List 集合是没有排序的,只能以元素的插入顺序作为输出的顺序。是外部定义并实现排序的,实现。

十一月廿七风雨大作 8672

Java 中Comparator 和 Comparable接口的区别

Java 中Comparator 和 Comparable接口的区别

weixin_42320587的博客 703

Comparable & Comparator的区别

Comparable & Comparator接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下, Comparable位于包java.lang下 Comparable接口将比较代码嵌入自身类中 Comparator在一个独立的类中实现比较。 像Integer、String等这些基本类型的JAVA封装类都已经实现了Comparable接口,这些类对象本身就支持自比较,直接调用Collections.sort()就可以对集合中元素的排序,无需自己去实现Compar

weixin_49263647的博客 2121

Comparable和Comparator的联系与区别

实际上我们发现这些这些集合或者数组之所以可以排序,都是实现了这个Comparable接口做到了可以在本类中实现排序。通过这两幅图片我们可以清晰的观察到这两个接口来的位置,一个是在java.lang,一个是在java.util这个就是为什么有一个需要导包而另外一个不需要的原因。每次只需要传入一个参数,因为这个方法就在本类中每次传入的形参就是本类的对象,可以理解为一个内置的比较器内部的成员会自己比较。关于Comparable和Comparator的联系和区别,我们先实现这个两个接口。...

sunalongfor的博客 274
上一篇: HTML标签整理(更新中)
下一篇: Java中的访问权限修饰符和非访问修饰符
icankeep
博客等级 码龄9年 11粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值