Java中对象的比较:复写基类的equals+Comparble接口类的比较+比较器比较+PriorityQueue的比较+源码分析

文章目录

  • Java中对象的比较
    • 一、元素的比较
    • 二、对象的比较
      • 1.复写基类的equals
      • 2.基于Comparble接口类的比较
      • 3.基于比较器比较
        • 三种方法的对比
      • 4. 集合框架中PriorityQueue的比较方式


Java中对象的比较


一、元素的比较

在Java中,基本类型的对象可以直接比较大小。

二、对象的比较

1.复写基类的equals

Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较

  • equals来比较相不相同
  • 用接口来实现 大于、小于的比较
    public static void main(String[] args) {Student student1 = new Student(13,"小明");Student student2 = new Student(13,"小明");System.out.println(student1==student2);//falseSystem.out.println(student1.equals(student2));//false}

1.== 比较的是两个对象的地址值,所以不同

2.equals是student调用的,暂时没有重写equals方法,调用的是默认继承的falseObject的equals方法,底层还是==

    public boolean equals(Object obj) {return (this == obj);}

3.要在student类中重写equals方法

    @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}System.out.println(student1.equals(student2));//true再次调用重写的equals方法,结果为true

2.基于Comparble接口类的比较

实现Comparble接口,在类中重写compareTo方法

class Student implements Comparable<Student> {@Overridepublic int compareTo(Student o) {return this.age-o.age;}}

1.通过差值返回的正负数,来比较大小

  • Compareble是java.lang中的接口类,可以直接使用

3.基于比较器比较

  • 用户自定义比较器类,实现Comparator接口
class NameComparator implements Comparator<Student>{//比较器@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}
}
class AgeComparator implements Comparator<Student>{//比较器@Overridepublic int compare(Student o1, Student o2) {return o1.age-o2.age;}
}
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;}
  • 因为name是String类型,所以调用的是String自己重写的compareTo方法进行比较
        NameComparator nameComparator = new NameComparator();int ret = nameComparator.compare(student1,student2);System.out.println(ret);AgeComparator ageComparator = new AgeComparator();int ret2 = ageComparator.compare(student1, student2);System.out.println(ret2);
  • 使用比较器时要先进行创建
  • 比较器比重写重写compareTo方法要更加灵活
  • Comparator是java.util 包中的泛型接口类,使用时必须导入对应的包
三种方法的对比
复写的方法说明
Object.equals直接覆写,只能比较是否相等
Comparable.compareTo手动实现接口,侵入性比较强,一旦实现,每次用该类都有顺序
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

4. 集合框架中PriorityQueue的比较方式

集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小
在这里插入图片描述

PriorityQueue采用了:Comparble和Comparator两种方式

  • 1.Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接

    口,并覆写compareTo方法

  • 2.用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现

    Comparator接口并覆写compare方法。

    public static void main(String[] args) {Student student1 = new Student(13,"小明");Student student2 = new Student(14,"小明");AgeComparator ageComparator = new AgeComparator();Queue<Student> priorityQueue = new PriorityQueue<>(ageComparator);priorityQueue.offer(student1);priorityQueue.offer(student2);
class AgeComparator implements Comparator<Student>{//比较器@Overridepublic int compare(Student o1, Student o2) {//return o1.age-o2.age;return o2.age-o1.age;//return o2.compareTo(o1);}
}
  • 传一个比较器
        Queue<Student> priorityQueue = new PriorityQueue<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o2.age - o1.age;}});//匿名内部类

匿名类的写法,等价于上面

        Queue<Student> priorityQueue = new PriorityQueue<>((o1, o2) -> {return o2.compareTo(o1);});//lambda表达式写法

lambda表达式写法

点击移步博客主页,欢迎光临~

偷cyk的图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/164505.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python3】【力扣题】232. 用栈实现队列

【力扣题】题目描述&#xff1a; 栈&#xff1a;线性集合。后进先出。 队列&#xff1a;线性集合。先进先出。 【Python3】代码&#xff1a; 解题思路&#xff1a;两个栈&#xff0c;一个入队的栈&#xff0c;一个出队的栈。出栈时&#xff0c;若出队的栈为空&#xff0c;才将…

RabbitMQ 死信队列

在MQ中&#xff0c;当消息成为死信&#xff08;Dead message&#xff09;后&#xff0c;消息中间件可以将其从当前队列发送到另一个队列中&#xff0c;这个队列就是死信队列。而在RabbitMQ中&#xff0c;由于有交换机的概念&#xff0c;实际是将死信发送给了死信交换机&#xf…

c语言 结构体 简单实例

结构体 简单例子 要求&#xff1a; 结构体保存学生信息操作 代码 #include <stdio.h>//定义结构体 struct student{int ID;char name[20];char sex;char birthday[8];int grade; };int main(){int number;printf("请输入学生个数&#xff1a;");scanf(&quo…

lua中的循环 while、for、repeat until三种循环方式、pairs和ipairs区别

lua中的循环 while、for、repeat until三种循环方式、pairs和ipairs区别 介绍for循环参数ipairs和pairs whilerepeat until总结 介绍 这里我用while、for、repeat until分别输出1-20之间的奇数 &#xff0c;具体的语法可以看下面的代码 for循环 参数 定义一个初始值为start…

ARM64 linux并发与同步之原子操作

卷2&#xff1a;调试与案例分析 第一章 并发与同步 画了两张简图&#xff0c;方便理解&#xff0c;如下&#xff1a; 针对并发源的问题&#xff0c;我接触的项目中都是SMP系统&#xff0c;目前大部分也都是SMP系统&#xff1b; 对于SMP系统&#xff0c;情况会更复杂。 □ 同…

Servlet详解

一.Servlet生命周期 初始化提供服务销毁 1.测试生命周期 package com.demo.servlet;import javax.servlet.*; import java.io.IOException;public class LifeServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {…

ros的安装和rosdep的初始化操作

ros的安装 安装ROS完整桌面版安装&#xff08;Desktop-Full&#xff09;环境配置rosdep初始化 安装ROS完整桌面版安装&#xff08;Desktop-Full&#xff09; 官网 选择思想者乌龟 选择ubuntu平台 操作 开始安装ROS 完整桌面版安装&#xff08;Desktop-Full&#xff0c;推荐…

小白学爬虫:手机app分享商品短连接获取淘宝商品链接接口|淘宝淘口令接口|淘宝真实商品链接接口|淘宝商品详情接口

通过手机APP分享的商品短链接&#xff0c;我们可以调用相应的接口来获取淘口令真实URL&#xff0c;进而获取到PC端的商品链接及商品ID。具体步骤如下&#xff1a; 1、通过手机APP分享至PC端的短链接&#xff0c;调用“item_password”接口。 2、该接口将返回淘口令真实URL。 3…

如何规划并新建大数据平台的独立生产域?5步走

一般来说&#xff0c;大数据平台包括以下4类数据生产域——生产生态环境&#xff08;正式生产环境&#xff09;、开发和测试环境、培训和演示环境、灾备环境。各生产域在由平台提供资源、安全、监控、故障恢复等保障的同时&#xff0c;不同的生产域之间还需要严格隔离&#xff…

基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python 计算机竞赛

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

Qt OpenMP使用

1、概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案&#xff0c;支持的编程语言包括C、C和Fortran。OpenMP提供了对并行算法的高层抽象描述&#xff0c;特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令&#xff0c;自动将程序并行处理&…

Android transform旋转rotate圆角矩形图roundedCorners,Kotlin

Android transform旋转rotate圆角矩形图roundedCorners&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.…