怎么用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

相关推荐

  • C语言中for循环与while循环怎么使用

    一、单层for循环 引例:C语言实现求1到10的和(用for循环实现) #include <stdio.h>int main(){ int i, sum = 0; for (i = 1; i <= 10; i++) sum = sum + i; printf(“sum = %dn”…

    2022年9月15日
    76100
  • word字体放大少了一截怎么解决

    解决方法 1、 首先把文字选中(全选的快捷键是ctrl A)。 2、在选中的文字上面右击鼠标,选择“段落”。 3、找到间距一栏,里面有行距和设置值.我们可以看到设置成了固定值。 4、点击行距旁边的下拉框按钮,然后选择单倍行距,或者1.5倍行距等等.这里以单倍行距为例。 5、选择好之后如图,点击确定。…

    2022年9月18日
    64900
  • Redis RESP协议如何实现

    回顾RESP协议 RESP是基于TCP来实现的Redis通信协议,该协议是以/r/n(行)进行分割的,协议支持5种类型,具体信息如下: 类型 前缀 备注 简单字符串 + 简单字符串以+开头 错误数据 – 错误数据以-开头 整数 : 整数以:开头 复杂字符串 $ 复杂字符串以$开头 数组 …

    2022年9月8日
    57900
  • word字体放大后上半部分缺失怎么解决

    解决方法 1、首先我们把缺失的文字框选出来。 2、鼠标右键点击之后选择段落。 3、然后选择行距,这里点击单倍行距。然后点击确定。 4、这样就能看见字体恢复了正常。 读到这里,这篇“word字体放大后上半部分缺失怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,…

    2022年9月11日
    77500
  • css样式中calc的含义是什么

    在css中,calc是计算的意思;calc可以理解为一个函数function,是calculate的缩写,用来指定一个元素的长度,calc可以给元素做计算,使用指定的单位值计算出长度值,语法为“元素{长度属性:calc(表达式)}”。 本教程操作环境:windows10系统、CSS3&&am…

    2022年9月15日
    76100
  • php二维数组如何求积

    求积步骤:1、定义一个变量并赋值1,语法“$cj=1;”;2、用foreach循环遍历外层数组元素,语法“foreach($arr as $v){//循环体代码}”;3、循环体中,用is_array()、array_product()和“*=”运算符求积即可,语法“if(is_array($v)){…

    2022年9月13日
    49500
  • 计算机怎么完成信息处理任务

    计算机通过单条指令完成信息处理任务;计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程;信息处理是指获取信息并采用某种方法和设备,按一定的目的和步骤对原始信息进行加工,使之转变成可利用的有效信息过程。 本教程操作环境:windows10系统…

    2022年9月16日
    62600
  • MySQL占用内存过大如何解决

    前言 对于部分小资玩家来说,服务器数量和内存往往是很有限的,像我个人的服务器配置就是2核4G5M。 4G内存对于Java玩家来说,真的不大,开几个中间件+自己的微服务真的还蛮挤的,然后又摊上MySQL这个大冤种。我本机上的MySQL仅仅只占几M内存(虽然我不怎么用,但是本机MySQL确实是开着的):…

    2022年9月16日
    1.1K00
  • 项目管理体系包括哪些

    项目管理是有效整合资源、高效实现项目目标的一整套独特的管理理念、方法论体系。它包含10大知识领域,5大过程和49个子过程;而要做好项目管理必须具备2大核心技能,以及过程中可能会用到的10个项目管理工具;做好项目管理我们通常要面临7大难点。下面我们将对这些内容进行详细说明。 一、什么是项目管理 官方解…

    2022年3月19日
    1.0K00
  • APT组织使用的10大安全漏洞分别是什么

    概述 APT攻击(Advanced Persistent Threat,高级持续性威胁)是利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式。APT攻击的原理相对于其他攻击形式更为高级和先进,其高级性主要体现在精确的信息收集、高度的隐蔽性、以及使用各种复杂的目标系统/应用程序漏洞等方面。 …

    2022年9月21日
    1.0K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部