怎么用Java比较两个对象的大小

一. 为什么需要比较对象

上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报ClassCastException异常

示例:

class Student{    String name;    int age;     public Student(String name, int age) {        this.name = name;        this.age = age;    }}public class Test {    public static void main(String[] args) {        Student s1 = new Student("张三",25);        Student s2 = new Student("李四",31);        PriorityQueue<Student> p = new PriorityQueue<>();        p.offer(s1);        p.offer(s2);    }}

结果:

怎么用Java比较两个对象的大小

原因:因为优先级队列底层使用了堆数据结构,往堆中插入元素时,需要进行元素的比较,而Student是没有办法直接比较的,所以抛出异常

二. 元素的比较

1. 基本类型的比较

Java中,基本类型的元素可以直接进行比较

public class TestCompare {    public static void main(String[] args) {        int a = 10;        int b = 20;        System.out.println(a>b);        System.out.println(a==b);        System.out.println(a<b);         char c1 = 'a';        char c2 = 'b';        System.out.println(c1==c2);        System.out.println(c1>c2);        System.out.println(c1<c2);         boolean b1 = true;        boolean b2 = false;        System.out.println(b1==b2);        System.out.println(b1!=b2);    }}

2. 引用类型的比较

class Student{    String name;    int age;     public Student(String name, int age) {        this.name = name;        this.age = age;    }}public class Test {    public static void main(String[] args) {        Student s1 = new Student("张三",25);        Student s2 = new Student("李四",31);        Student s3 = s1;        System.out.println(s1==s2);  //false        System.out.println(s1==s3);  //true        //System.out.println(s1<s2); 编译报错        //System.out.println(s1>s3); 编译报错    }}

从上述的结果来看,自定义类型不能使用>,<来比较,为什么可以使用==来比较?

==比较自定义类型时,比较的是对象的地址是否相同

但是我们往往需要比较对象的内容,如往优先级队列中插入某个对象,需要按照对象的内容来调整堆,那如何比较呢?

三. 对象比较的方法

1. equals方法比较

Object类是每一个类的基类,其提供了equals()方法来进行比较内容是否相同

怎么用Java比较两个对象的大小

但是Object中的equals方法默认是用==来比较的,也就是比较两个对象的地址 ,所以想让自定义类型可以比较,可以重写基类的equals()方法

例:

class Student{    String name;    int age;     public Student(String name, int age) {        this.name = name;        this.age = age;    }     @Override    public boolean equals(Object obj) {        if(this == obj){            return true;        }        if(obj==null || !(obj instanceof Student)){            return false;        }        Student s = (Student) obj;        return this.age==s.age && this.name.equals(s.name);    }}public class Test {    public static void main(String[] args) {        Student s1 = new Student("张三",25);        Student s2 = new Student("李四",31);        Student s3 = new Student("李四",31);        System.out.println(s1.equals(s2));        System.out.println(s2.equals(s3));    }}

结果:可以比较内容是否相同

怎么用Java比较两个对象的大小

重写equals方法的步骤

  • 如果两个对象的地址相同,返回true

  • 如果传入的对象为null,返回false

  • 如果传入的对象与调用的对象不是同一个类型,返回false

  • 如果内容都相同则返回true,否则返回false

注意事项

equals()方法只能比较两个对象是否相同,不能按照>,<的方式来进行比较

2. 基于Comparable接口的比较

对于引用类型,如果想按照大小的方式进行比较,在定义类时实现Comparable接口,然后在类中重写compareTo方法

例:比较两个人的大小,一般按照年龄来比较

class Person implements Comparable<Person>{    String name;    int age;     public Person(String name, int age) {        this.name = name;        this.age = age;    }     @Override    public int compareTo(Person o) {        if(o == null){            return 1;        }        return this.age-o.age;    }}public class Test1 {    public static void main(String[] args) {        Person p1 = new Person("小王",22);        Person p2 = new Person("小张",21);        Person p3 = new Person("小方",22);        System.out.println(p1.compareTo(p2)); //>0表示大于        System.out.println(p2.compareTo(p3)); //<0表示小于        System.out.println(p1.compareTo(p3)); //==0表示相等    }}

compareTo方法是java.lang中的接口类,可以直接使用

使用Comparable接口使得Student类型的对象可以插入到优先级队列中

import java.util.PriorityQueue; class Student implements Comparable<Student> {    String name;    int age;     public Student(String name, int age) {        this.name = name;        this.age = age;    }     @Override    public int compareTo(Student o) {        if(o == null){            return -1;        }        return this.age-o.age;    }}public class Test {    public static void main(String[] args) {        Student s1 = new Student("张三",25);        Student s2 = new Student("李四",31);        Student s3 = new Student("李四",35);        PriorityQueue<Student> p = new PriorityQueue<>();        p.offer(s1);        p.offer(s2);        p.offer(s3);    }}

结果:Student类型的对象也可以插入优先级队列中

怎么用Java比较两个对象的大小

3. 基于Comparator接口的比较

按照比较器的方式比较具体步骤如下:

  • 创建一个比较器类,实现Comparator接口

  • 重写compare方法

使用比较器使得Student类型的对象可以插入到优先级队列中

import java.util.Comparator;import java.util.PriorityQueue; class Student {    String name;    int age;     public Student(String name, int age) {        this.name = name;        this.age = age;    }}class StudentComparator implements Comparator<Student>{    @Override    public int compare(Student o1, Student o2) {        if(o1 == o2){            return 0;        }        if(o1 == null){            return -1;        }        if(o2 == null){            return 1;        }        return o1.age-o2.age;    }}public class Test {    public static void main(String[] args) {        Student s1 = new Student("张三",25);        Student s2 = new Student("李四",31);        Student s3 = new Student("李四",35);        PriorityQueue<Student> p = new PriorityQueue<>(new StudentComparator());        p.offer(s1);        p.offer(s2);        p.offer(s3);    }}

结果:Student类型的对象可以插入到优先级队列中

怎么用Java比较两个对象的大小

Comparator是java.util包中的泛型接口类,使用必须导入相应的包

4. 三种比较方式对比

重写的方法 说明
Object.equals 只能比较两个对象的内容是否相等,不能比较大小
Comparable.compareTo 类要实现接口,对类的侵入性较强,破坏了原来类的结构
Comparator.compare 需实现一个比较器类,对类的侵入性较弱,不破坏原来的类

Comparable,Comparator使用哪种比较方式呢?

如果拿到的是别人定义的类,我们不能对类进行操作,就选用创建类实现Comparator接口的方法

如果类是用户自己定义的类,可以对类进行操作,则采用实现Comparable接口的方法

关于“怎么用Java比较两个对象的大小”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:怎么用Java比较两个对象的大小,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24614

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云亿速云认证作者
上一篇 2022年9月13日 下午11:37
下一篇 2022年9月13日 下午11:37

相关推荐

  • SQL注入语法有哪些

    仅供参考学习使用。 SQL注入语法 报错注入 updatexml(1,concat(0x7e,(select database()),0x7e),1)–+extractvalue(1,concat(0x7e,(select database()),0x7e),1)–+select count(*…

    2022年9月6日
    25200
  • windows Office365excl表格冻结窗口在哪

    Office365excl表格冻结窗口位置: 1、首先打开office365,点击新建一个excel表格。 2、然后选中自己需要操作的表格进行编辑。 3、点击上方工具栏中的“视图”。 4、最后点击“冻结窗格”即可完成操作。 关于“windows Office365excl表格冻结窗口在哪”的内容就介…

    2022年9月20日
    24700
  • windows显示器颜色如何校正

    显示器颜色校正的方法: 1、首先点击左下角开始,然后点击“windows系统”打开“控制面板”。 2、然后点击里面的“颜色管理”。 3、在任务选项中点击“高级”。 4、下拉,点击“校准显示器”。 5、最后就可以根据提示进行校准了。 到此,相信大家对“windows显示器颜色如何校正”有了更深的了解,…

    2022年8月27日
    24100
  • transform在CSS中的含义是什么

    在CSS中,transform的意思为改变、变形,主要用于设置元素的形状改变,实现元素的2D或3D转换;该属性可以配合属性值(转换函数)来对将元素进行旋转rotate、扭曲skew、缩放scale、移动translate以及矩阵变形matrix。 本教程操作环境:windows7系统、CSS3&am…

    2022年9月22日
    33600
  • windows bios设置u盘启动没有u盘选项如何解决

    解决方法: 1、启动盘制作完成之后,可以在开机的页面中按启动热键F8进入“bios”。 2、在这里可以找到usb高级设置的选项,将其状态改为启动,右侧类型改为“enabled”。 3、设置完成没有找到usb选项的话可以切换至boot,点击图中所指进入设置。 4、在这里你可以看到光标的位置,启动优选的…

    2022年9月22日
    31300
  • mdf文件打开方法是什么

    mdf文件怎么开: 如果mdf是镜像文件,我们需要虚拟光驱进行加载,下载并安装Daemon Tools虚拟光驱软件,打开就行了。 如果mdf是数据库文件,我们需要使用SQLServer管理工具进行打开,打开后点击文件,选择导入连接,选择需要打开的mdf文件 1、找到要打开的数据库文件 2、该数据库文…

    2022年9月8日
    65700
  • Vue.js 前端路由和异步组件是什么

    目录 文章目标 P6 P6+ ~ P7 一、背景 二、前端路由特性 三、面试!!! 四、Hash 原理及实现 1、特性 2、如何更改 hash 3、手动实现一个基于 hash 的路由 五、History 原理及实现 1、HTML5 History 常用的 API 2、pushState/replac…

    2022年9月13日
    21600
  • JavaScript怎么取消请求

    取消 XMLHttpRequest 请求 当请求已经发送了,可以使用 XMLHttpRequest.abort() 方法取消发送,代码示例如下: const xhr = new XMLHttpRequest();xhr.open(‘GET’, ‘&lt;http://127.0.0.1:30…

    2022年9月15日
    24200
  • coreldraw如何抠图

    coreldraw抠图的方法 1、打开软件,点击上方导入,选择图片。 2、右键单击图片,选择锁定对象。 3、点击左边的手绘工具。 4、选择钢笔工具,勾出轮廓。 5、这个时候线条还不是很流畅,所以我们点击左边形状来调整一下。 6、然后右键单击图片,解除锁定。 7、右键单击,选择编辑内容,作调整,这时抠…

    2022年9月26日
    17900
  • Java设计模式之装饰模式是什么及怎么实现

    1.什么是装饰模式 当我们想要改进或增强某个对象的功能,而又不想继承该类创建子类,可以考虑使用装饰模式。 使用装饰模式增强对象的某个功能,比生成子类再增强,更为灵活。 2.如何实现 1)抽象组件:定义一个抽象类,该抽象类定义了“被装饰者”需要被“装饰的方法” 2)具体组件:抽象组件的一个子类。成为“…

    2022年8月29日
    14800
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部