小结

  • 1.为什么需要Comparator接口和Comparable接口?
  • 2.感觉有Comparable就够了,为什么要有Comparator?
  • 3.equals VS Comparable.compareTo VS Comparator.compare
  • 4.和 java 集合框架的配合

1.为什么需要Comparator接口和Comparable接口?

答:因为对象无法带有顺序,引用类型无法使用大于、小于。

解决:1)自然顺序–定义类实现Comparable接口
2)非自然顺序–定义比较器(实现Comparator接口)

  Person p = new Person(……);Person q = new Person(……);//自然顺序p.comparaTo(q); //非自然顺序Comparator<Person> cmp = new ……;cmp.compare(p,q);

2.感觉有Comparable就够了,为什么要有Comparator?

答:1.有些类天生没有自然顺序或者自然顺序不满足当前我们的需要,所以需要引入比较器来比较。

2.Comparable 使用的时候,必需要修改比较类(使类继承Comparable接口);Comparator 不需要修改类,只需要新定义比较类即可。

3.Comparable 只能定义一种比较规则;Comparator 可以定义多种比较规则(定义多个比较类)。

3.equals VS Comparable.compareTo VS Comparator.compare

覆写的方法 说明
Object.equals 因为所有的类都是继承自Object的,所以直接覆写即可,不过只能比较是否相等
Comparable.compareTo 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序
Comparator.compare 需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强

4.和 java 集合框架的配合

  1. 使用 contains 类似的方法,内部基本在调用元素的 equals 方法,所以要求元素覆写过 equals 方法
  2. 使用 HashMap,key 的比较内部会调用 equals 方法,所以要求元素覆写过 equals 方法
  3. 使用排序相关方法,内部需要进行比较,所以或者选择实现 Comparable 或者传入一个 Comparator
  4. 使用 TreeMap,key 需要进行大小比较,所以或者选择实现 Comparable 或者传入一个 Comparator
  5. ……

Java--对象的比较2(类比)相关推荐

  1. 《深入理解java虚拟机》笔记1——Java内存区域与Java对象

    运行时数据区域 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程 ...

  2. 深入理解JVM(1)——Java内存区域与Java对象

    最近放暑假在家,没有实验室的工作要做,正好趁这个时间恶补了之前一知半解的JVM知识,使用的主要学习资料是周志明大大的<深入理解Java虚拟机--JVM高级特性与最佳实践>,我仔细拜读了两遍 ...

  3. Java对象的生命周期与垃圾回收以及四种引用

    转载请注明出处: Java对象的生命周期 与 垃圾回收 - ITeye博客 - 老Man 创建对象的方式 用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.re ...

  4. 1.Java内存区域与Java对象

    运行时数据区域 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程 ...

  5. java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用

    创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...

  6. java 对象内存布局_Java--对象内存布局

    在HotSpot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头部.实例数据.对齐填充. 一.对象头部Header的布局 Mark Word Class 指针 在32位系统下,上面两部分各占4 ...

  7. java对象转xml 高性能_通过实例学习JAVA对象转成XML输出

    一.总体说明 XML和JSON 是最为常用的数据交换格式 本例子演示如何将java对象,转成XML输出. 二.流程 1.在上文的例子中,创建一个包"com.waylau.rest.bean& ...

  8. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包括以下几个阶段: 创建阶段(Created) 应用阶段(In Use) 不可见阶段(Invisible) 不可达阶段(Unreachable) 收 ...

  9. 理解Java对象:要从内存布局及底层机制说起,话说....

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上 ...

  10. 一个Java对象到底有多大?

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 出处:http://u6.gg/swLPg 编写Java代码的时候,大多数情况下,我们很少关注一 ...

最新文章

  1. php方行图片裁剪为圆形,如何将图片裁成圆形、矩形……各种形状?
  2. 科大讯飞CV赛baseline:图像分类实践+0.55
  3. (总结)CentOS 6.x使用yum快速安装Apache+PHP+Tomcat(JSP)+MySQL
  4. 群晖 emby_NAS上安装emby,打造家庭媒体中心
  5. iOS常见问题(5)
  6. Git ----fatal: unable to access ‘https://gitee.com/***.git/‘: SSL certificate problem: unable
  7. python的pyqt5_Pycharm+Python+PyQt5使用详解
  8. 开源创新的理念_开源如何解决创新问题
  9. java 创建存储过程_如何在pl/sql中创建及调用JAVA存储过程 | 学步园
  10. [Linux] 内核模块proc使用 实例:统计所有进程的信息
  11. Weave 网络结构分析 - 每天5分钟玩转 Docker 容器技术(64)
  12. webrtc研究资源摘录
  13. 自适应算法和学习算法的区别
  14. 微信朋友圈 腾讯服务器,朋友圈@微信能得一面红旗?腾讯服务器一度宕机
  15. 23种设计模式python版
  16. 【FFmpeg编程进阶】(13)FLV 解码器初始化函数 ff_h263_decode_init() 代码分析 --- 待更新
  17. 使用Java调用shell脚本时遇到的问题
  18. 聚合物-化学键-聚合物PEG-Hyd-PDLLA /PLA-PHis-hyd-PEG/PEG-PUSeSe-PEG
  19. 西南大学计算机2019专业英语秋季答案,西南大学2019年秋《大学英语B》作业资料参考答案...
  20. 微信小程序输入联想、表格

热门文章

  1. 小小拷贝-strcpy洒洒水啦
  2. SQL优化 —— in与not in
  3. 计算机网络背诵笔记,震惊!网络搜索、数字笔记和云盘,让你变笨!!!
  4. anemometer mysql 500_Anemometer基于pt-query-digest将MySQL慢查询可视化
  5. 全国计算机技术与软件专业技术考试----(中级资格/工程师)各资格证详细介绍
  6. 用Python让你完成一次绝美樱花视觉体验瞬间陷入二次元~
  7. NIPS最佳,惊人的天赋与无人察觉的缺陷并存,GPT-3的未来有多少种可能......
  8. 7 series FPGAs Transceiver Wizard IP核使用和测试
  9. html成绩百分制转换为,设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...
  10. [Transformer]A Survey on Vision Transformer