Effective Java笔记(14)考虑实现 Comparable 接口

《Effective Java》第30条:优先考虑泛型方法 原文P106:为了修正这些警告,使方法变成是类型安全的,要将方法声明修改为声明一个类型参数,表示这三个集合的元素类型(两个参数和一个返回值),并在方法中使用类型参数。这里解释下为什么第10行的警告可以被忽略,是因为恒等式返回的就是原本的参数,未做任何类型的修改,所以无论T是什么,返回的都还是T,能保证UnaryOperator 是类型安全的。这里又给出了一个概念:递归类型限制,什么是递归类型限制:类型参数的限制条件里,包含了类型参数本身(像递归一样自我引用)。同学们也可以参照书上的代码测试下。 阅读详情

compareTo 方法并没有在 Object 类中声明 。 相反,它是 Comparable 接口中唯一 的方法 。
compareTo 方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外 ,它与 Object 的 equals 方法具有相似的特征,它还是个泛型( generic ) 。 类实现了 Comparable 接口,就表明它的实例具有 内在的排序关系(natural ordering ) 。 为实现 Comparable 接口的对象数组进行排序就这么简单 :

Arrays.sort(a);

        对存储在集合中的 Comparable 对象进行搜索、计算极限值以及自动维护也同样简单 。 例如,下面的程序依赖于实现了 Comparable 接口的 String 类,它去掉了命令行参数列表中的重复参数,并按字母顺序打印出来:

public class WordList {
    public static void main(String[] args) {
        Set<String> S = new TreeSet<>() ;
        Collections.addAll(s,args);
        System.out.println(s);
    }
}

        一旦类实现了 Comparable 接口,它就可以跟许多泛型算法( generic algorithm )以及依赖于该接口的集合实现( collection implementation )进行协作 。 你付出很小的努力就可以获得非常强大的功能。事实上,Java 平台类库中 的所有值类( value classes ),以及所有的枚举类型都实现了 Comparable 接口 。 如果你正在编写一个值类,它具有非常明显的内在排序关系,比如按字母顺序、按数值顺序或者按年代顺序,那你就应该坚决考虑实现 Comparable 接口:

public interface Comparable<T> {
    int compareTo(T t);
}

compareTo 方法的通用约定与 equals 方法的约定相似 :

        将这个对象与指定的对象进行比较 。 当该对象小于、等于或大于指定对象的时候,分别返回一个负整数、零或者正整数 。 如果由于指定对象的类型而无法与该对象进行比较,则抛出 ClassCastException 异常 。

        compareTo 约定并没有看起来那么复杂 。 与 equals 方法不同的是,它对所有的对象强行施加了一种通用的等同关系,compareTo 不能跨越不同类型的对象进行比较:在比较不同类型的对象时,compareTo 可以抛出 ClassCastException 异常 。 通常,这正是compareTo 在这种情况下应该做的事情 。 合约确实允许进行跨类型之间的比较,这一般是在被比较对象实现的接口中进行定义 。

        编写 compareTo 方法与编写 equals 方法非常相似,但也存在几处重大的差别 。因为 Comparable 接口是参数化的,而且 comparable 方法是静态的类型,因此不必进行类型检查,也不必对它的参数进行类型转换 。 如果参数的类型不合适,这个调用甚至无法编译 。 如果参数为 null ,这个调用应该抛出 NullPointerException 异常,并且一旦该方法试图访问它的成员时就应该抛出异常 。

        CompareTo 方法中域的比较是顺序的比较,而不是等同性的比较 。 比较对象引用域可以通过递归地调用 compareTo 方法来实现 。 如果一个域并没有实现 Comparable 接口,或者你需要使用一个非标准的排序关系,就可以使用一个显式的 Comparator 来代替 。 或者编写自己的比较器,或者使用已有的比较器例。

        在 compare To 方法中使用关系操作符 < 和 > 是非常烦琐的,并且容易出错,因此不再建议使用 。

        如果一个类有多个关键域 ,那么 , 按什么样的顺序来比较这些域是非常关键的 。 你必须从最关键的域开始,逐步进行到所有的重要域 。 如果某个域的比较产生 了非零的结果(零代表相等),则整个比较操作结束,并返回该结果。 如果最关键的域是相等的,则进一步比较次关键的域,以此类推 。 如果所有的域都是相等的 , 则对象就是相等的 ,并返回零 。 

        总而言之,每当实现一个对排序敏感的类时,都应该让这个类实现 Comparable 接口,以便其实例可以轻松地被分类 、搜索,以及用在基于比较的集合中 。 每当在 compareTo 方法的实现中比较域值时,都要避免使用 < 和>操作符,而应该在装箱基本类型的类中使用静态的 compare 方法,或者在 Comparator 接口中使用比较器构造方法 。

深度强化学习算法PPO训练Pendulum returnadv = 0print('状态空间维度:', state_n)print('动作空间维度:', action_n)steps = []if done:breakif done:breakelse:steps = []if done:break。 阅读详情

相关推荐

Netty源码分析系列之writeAndFlush()下

write()只会将数据只是发送到了ChannelOutboundBuffer 缓冲区中,还没有被发送到操作系统的套接字中只有当调用了 flush()方法后,才会真正将数据发送到套接字中。那么 flush()方法的源码又是如何执行的呢?

天堂的博客 1572

java比较器、迭代器和枚举类型详解

详细介绍了Java语言中的比较器接口Comparable,Comparator,以及equals和==的区别,还介绍了Java中的迭代器Iterator接口和枚举数据类型

ifhuke的博客 422

解密TMS320F28377D双核工程中的内存分配艺术:从CMD文件到实战优化

本文深入解析TMS320F28377D双核DSP的内存管理艺术,从CMD文件配置到实战优化技巧。详细介绍了SARAM、GSRAM等内存类型的特性与配置方法,提供双核协同、性能优化及高级调试的实用方案,帮助开发者提升系统实时性和稳定性。

weixin_29190651的博客 663

Effective Java -- 排序敏感的类建议实现Comparable接口

此系列文章为本人对《Effective Java》一书的学习笔记,主要是记录对书中重点内容的理解。既然有缘看到此文,那么希望能对你有所帮助。本文对应原书 第14条 考虑实现Comparable接口

心之所往 码之所向 755

深入解析ChangeFormer:基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer这一基于Transformer的孪生网络在遥感变化检测中的创新应用。通过分层Transformer编码器、特征差异计算模块和轻量级MLP解码器的设计,ChangeFormer在LEVIR-CD数据集上取得了90.4%的F1分数,显著优于传统卷积网络。文章还详细探讨了工程化实现、训练调参和模型部署的优化策略,为遥感变化检测领域提供了新的技术范式。

weixin_29051811的博客 731

算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

【代码】算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

尘世冰封的专栏 1017

Java 枚举(enum)

目录 前言 一、枚举是什么? 二、枚举的定义 1.自定义枚举类 2.enum关键字创建枚举类 三、自定义枚举类 1、步骤 2、代码 3、使用 三、enum定义枚举类 1、定义 2、使用 3、switch 中使用枚举类 4、有关构造函数 5、实现接口的枚举类 6、有抽象方法的枚举类 ​​​​​​​​ 前言 本篇内容是对Java中的枚举类进行学习记录 一、枚举是什么? Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 1...

lcgskycby的博客 3656

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 247

Java的比较接口 Comparable与Comparator

我们知道Comparable与Comparator接口都能使你的对象拥有你希望的顺序,那么为什么设计两个接口呢? 我们看一下Comparable的使用场景: package com.dusk; /** * Created by dushangkui on 2017/6/9. */ public class Student implements Comparable { priv

键圣的博客 477

【产品经理修炼之道】- 基金产品-“TA系统 ”

TA:Transfer Agent 缩写,通常称成“登记过户”。开放式基金登记过户(TA)系统是基金的登记过户系统。其功能涵盖了基金交易业务的各个环节,包括账户业务处理,如投资者开户、修改账户资料、挂失/解挂等;日常交易业务处理,如认购、申购(一般申购和定期定额)、赎回(一般赎回、指定赎回、预约赎回等)、转托管、基金转换等;特殊业务处理,如非交易过户、账户冻结/解冻等;分红业务处理,如现金分红和红利再投资。

xiaoli8748的专栏 1677

【部署】Kimi 接入OpenClaw完整步骤及关键注意事项

本文详细介绍了如何将Kimi AI接入OpenClaw系统的完整步骤。首先需确保环境满足OpenClaw版本要求和系统支持,然后通过配置向导完成本地网关设置和Kimi模型接入,包括API密钥配置。文章提供了详细的命令操作和界面截图指导,并重点说明了安全警告处理、服务状态检查、API密钥有效性验证等关键注意事项。最后还展示了Kimi流量消耗明细和问题排查方法,帮助用户顺利完成接入并解决常见问题。整个流程清晰明了,涵盖了从环境准备到最终验证的全部环节。

海兰 7185

14. JAVA 枚举(Enum、类集EnumMap&EnumSet 、实现接口、定义抽象方法) ----- 学习笔记

本章目标: 1

forfan06的专栏 3682

YOLOv11 改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLOv11中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLOv11,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 1279

《Effective Java》学习笔记14 考虑实现Comparable接口

本栏是博主根据如题教材进行Java进阶时所记的笔记,包括对原著的概括、理解,教材代码的报错和运行情况。十分建议看过原著遇到费解地方再来参考或与博主讨论。致敬作者Joshua Bloch和各路翻译者们,以及为我提供可参考博文的博主们。 考虑实现Comparable接口 Comparable接口 {@link Comparable#compareTo(Object)}方法虽然非常常用,但并没有...

欢迎访问 花落的速度 的博客 372

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《Effective Java》第14条:考虑实现 Comparable 接口

许多程序员都喜欢这种方法的简洁性,在使用这个方法时,为了简洁起见,可以考虑使用Java的静态导入设施,通过静态比较器构造方法的简单的名称就可以对它们进行引用。以上的约定类似于前面第10条关于equals的约定,同样的对于equals的告诫也同样适用:“无法在用新的值组件扩展可实例化的类时,同时保持compareTo约定,除非愿意放弃面向对象的抽象优势”,即一个类如果被子类继承了,那么两个不同的子类调用父类的compareTo的时候,也可能会相等,就不满足上述的约定。上面的例子违反了传递性。

TD_FAlmK的博客 734

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

《Effective Java》解读第14条:考虑实现Comparable接口

摘要: 实现Comparable接口可为类定义自然排序,支持泛型算法和有序集合。compareTo方法需满足自反性、对称性、传递性和一致性(建议与equals结果一致)。最佳实践:优先使用包装类的compare方法或Java 8+的Comparator构建方法(如comparingInt、thenComparingInt),避免直接相减导致的整数溢出,并按字段重要性分级比较。注意处理null值,并推荐将比较器声明为static final以避免重复创建。违反compareTo与equals一致性时需明确说明

Cosmoshhhyyy的博客 959

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Effective Java 【对于所有对象都通用的方法】第14条 考虑实现Comparable接口

目录Comparable接口接口规约如何重写?总结 Comparable接口 与本章中讨论的其他方法不同,compareTo方法没有在Object类中声明。相反,它是Comparable接口中唯一的方法。compareTo方法不但允许进行简单的等同比较,而且允许执行顺序比较,除此之外,它与Object的equals方法具有相似的特征,它还是个泛型(generic)。类实现Comparable接口的对象数组进行排序就这么简单。 Arrays.sort(a); **一旦类实现了Comparable接口,它就可

zhangxiaoxiao9527的博客 336

effective java之【考虑实现comparable接口】

应用场景&gt;&gt;&gt;要实现对对象的排序   如:根据名称进行排序  在展示的时候就可以让用户根据字母的顺序进行选择,更清晰和快捷   compareTo()方法是java.lang.Comparable接口的唯一方法。一个类实现了Comparable接口就表明这个实例在内在有排序关系。         若把实例都存在数组a中 实例对象实现了Comparable接口 那么可以简单...

我想去华为 155

【Effective Java】10~14 equals,hashcode,toString,clone,Comparable

看完《Effective Java》感觉写的相当好,中间大部分都以作为参考手册,故整理出来。结合框架源码,jdk源码,自己的demo,给大家更多的示例,便于大家理解。每一条的介绍为个人理解,如果有任何不对,希望指出。对于博客有任何建议也希望给出建议。10.覆盖 equals 时请遵守通用约定 equals设计的初衷时满足以下4点每个实例唯一类没有必要提供逻辑相等的测试功能,Object的equals已经足够超类已经覆盖了equals,对于子类同样适用类如果是私有的,确保它的equals永远不会被调用 如果你

Nortyr的博客 160

快速带你看完《Effective Java》—— 对象通用方法篇

文章目录10 覆盖equals时要遵守通用约定11 覆盖equals时总要覆盖hashCode12 始终要覆盖toString13 谨慎地覆盖clone14 考虑实现Comparable接口 豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练武,既需要外在的武功招式(编程语言、工具、中间件等等),也需要修炼心法(设计模式、源码等等)学霸、学神OR开挂 我个人在Java领域也已经学习了近5年,在修炼“内功”的方面也通过各

如切如磋,如琢如磨 1225

Effective Java笔记

文章目录第二章:创建和销毁对象第1条: 静态工厂方法代替构造器优势1:它们有名称优势2:不必在每次调用它们的时候都创建一个新对象。优势3:它们可以返回原返回类型的任何子类对象。优势4:所返回的对象的类可以随着每次调用而发生变化优势5:方法返回的对象所属的类,在编写包含该静态方法的类时可以不存在。缺陷1:类如果不含公有或保护的构造器。就不能被子类化(继承)。#### 缺陷2:没有统一的标准。相对构造函数较难查明。 第二章:创建和销毁对象 第1条: 静态工厂方法代替构造器 优势1:它们有名称 更为清楚。 优势2

weixin_44677487的博客 535

【Effective Java】Ch3_Methods:Item12_考虑实现Comparable接口

与本章讨论的其他方法不同,compareTo方法并不是在Object类中声明的。相反,它是Comparable接口中的唯一方法。它与Object的equals方法有点类似,但它不仅仅是简单地进行相等性比较,还能执行顺序比较,同时它还是个泛型。类实现Comparable接口后,就表明其实例拥有自然顺序。若要对实现了Comparable接口的对象数组进行排序,只需要执行: Arrays.sort

Alpha's 学习笔记 1683

Effective Java 3rd 条目14 考虑实现Comparable

不像本章讨论的其他方法,compareTo方法不是在Object中声明的。更确切地说,它是Comparable接口的唯一方法。在角色上像Object的equals方法,除了它允许简单的相等比较之外,它还允许顺序比较,而且它是支持泛型的。通过实现Comparable,一个类表明它的实例有一个自然排序(natural ordering)。由实现Comparable的对象组成的一个队列,它的排序就像下面...

tigershin的专栏 480

《Effective Java》阅读笔记

第2章 第1条:用静态工厂方法代替构造器 辅助理解静态工厂的文章,关于 Java 的静态工厂方法,看这一篇就够了! 第2条:遇到多个构造器参数时要考虑使用构建器(即builder模式) 辅助理解建造者模式的文章,Java 大白话讲解设计模式之 – 建造者(Builder)模式 还需要学习下UML图,Java 大白话讲解设计模式之 – UML类图 第42条:Lambda优先于匿名类 ...

Allenlzcoder的博客 287

【Effective Java】第3章 读书笔记

第3章 对所有对象都通用的方法 10,重写 equals 时请遵守通用规定 10.1 在以下情况,类的每个实例都与它自身相等,不重写 equals 方法 类的每个实例都是唯一的。 类没有提供逻辑相等的测试功能。 超类已经重写了 equals 。超类的行为对于这个类也是合适的。 类是私有的,或者是包级私有的,可以确定它的 equals 方法永远不会被调用。 10.2 equals 通用约定 自反性 对称性 传递性 一致性 非空性:对于任何非null的引用值x,x.equals(null) 必须返回fal

qq_45050687的博客 1206

Effective Java(第三版) 学习笔记 - 第三章 对于所有对象都通用的方法 Rule10~14

Effective Java(第三版) 学习笔记 - 第三章 对于所有对象都通用的方法 Rule10~14 目录 Effective Java(第三版) 学习笔记 - 第三章 对于所有对象都通用的方法 Rule10~14 Rule10 覆盖equals时请遵守通用约定 equals需要遵守的约定 什么情况下不需要重新定义equals Rule11 覆盖equals时总要覆盖hashCode Rule12 始终要覆盖toString Rule13 谨慎地覆盖clone Rule14 考虑实现

weixin_44453385的博客 584
上一篇: Effective Java笔记(13)谨慎地覆盖 clone
下一篇: Java 并发编程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值