JDK8源码阅读(四) java.lang.Comparable

本文深入解析Java中的Comparable接口,探讨其在实现类自然排序、自动排序List和数组、以及作为排序映射键或集合元素的角色。文章强调了自然排序与equals方法一致性的重要性,解释了compareTo方法的规范和推荐实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类

1.1 类修饰符

 

A. 是一个接口,这个接口对实现它的每个类的对象施加了一个总的顺序。这种排序称为类的自然排序,类的CompareTo方法称为类的自然比较方法;

B. 实现此接口的对象List(和数组)可以按Collections.sort(和Array.sort)自动排序。实现此接口的对象可以用作已排序映射中的键或已排序集中的元素,而无需指定比较器;

C. 对于类C的每个e1和e2: 当且仅当e1.CompareTo(e2)==0的布尔值与e1.Equals(e2)的布尔值相同时,类C的自然顺序才被称为与equals一致。请注意,空值不是任何类的实例,并且e.CompareTo(null)应引发NullPointerException,即使e.Equals(null)返回false;

D. 强烈建议(尽管不是必需的)自然顺序与equals一致。这是因为没有显式比较器的sorted sets或sorted maps 的元素或键在自然顺序与equqls不一致的时候会表现出“奇怪”的行为。特别是,这样的sorted sets或sorted maps违反了集合(或映射)的一般约定,集合(或映射)是根据equals方法定义的;  例如,如果一个添加了两个键a和b,那么(!对于不使用显式比较器的排序集,!a.equals(b)&&a.compareto(b)==0,第二个加法操作返回false(排序集的大小不会增加),因为从排序集的角度来看,a和b是等效的。

E. 实际上,实现可比较的所有Java核心类都具有与平等一致的自然顺序。一个例外是java.math.bigdecimal,它的自然排序将bigdecimal对象等同于具有相同值和不同精度的对象(如4.0和4.00)。

 

1.2 类结构图

 

二、字段

1.1 字段列表

无。

 

三、方法

3.1 方法列表

注:如上图,共有1个方法。 

        绿色打开的锁代表是public,  红色关闭的代表是private, 灰色的钥匙代表的protected。

 

3.2 方法修饰符


3.3 方法详解

3.3.0 [静态]代码块

无。

 

3.3.1 compareTo(T o)

A. 将此对象与指定的顺序对象进行比较。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象;

B. 实现者必须确保所有x和y的sgn(x.compareto(y))=-sgn(y.compareto(x))。(这意味着x.compareto(y)必须引发异常,如果y.compareto(x)引发异常。);

C.  实现者还必须确保关系是可传递的:(x.compareto(y)>0和y.compareto(z)>0)表示x.compareto(z)>0;最后,实现者必须确保x.compareto(y)==0意味着所有z的sgn(x.compareto(z))==sgn(y.compareto(z));

D. 强烈建议,但不严格要求(x.compareto(y)==0)==(x.equals(y))。一般来说,任何实现可比较接口并违反此条件的类都应该清楚地表明这一事实。建议使用的语言是“注意:此类具有与等于不一致的自然顺序。”;

注: 在前面的描述中,符号sgn(expression)指定数学符号函数,根据表达式的值是负、零还是正,定义为返回-1、0或1中的一个;

 

 

 

四. JDK8源码阅读系列链接

  1. JDK8源码阅读(一) java.util.Object
  2. JDK8源码阅读(二) java.util.Objects
  3. JDK8源码阅读(三) java.io.Serializable   
  4. JDK8源码阅读(四) java.lang.Comparable
  5. JDK8源码阅读(五) java.lang.CharSequence
  6. JDK8源码阅读(六) java.lang.String

注: 今年要把JDK的一些基本的类的源码整理出来,欢迎大家指正和讨论。

         如果有错误的地方,欢迎各位老师指正。

         如果您觉得还不错,点个赞的话  我会很感激的,谢谢~

         转载请注明链接来源即可。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值