Java对象的比较(详解三种比较方式)

Java对象的比较

  • 一、基本类型的比较
  • 二、引用类型的比较
  • 三、三种自定义比较的方式
    • 1、重写equals()方法
    • 2、基于Comparble接口比较
    • 3、基于Comparator比较器进行比较

一、基本类型的比较

对于Java中的基本类型而言,Java可以对其直接比较。整型浮点型就是直接比较其大小,字符型则是按照其背后的编码大小进行比较。

二、引用类型的比较

对于引用而言,Java中默认情况下只能对其地址进行比较,并且我们只能判断其是否相等,而不能进行大于小于的比较。也就是说,当我们使用==判断其是否相等的时候,Java只会比较两个引用所指向的地址是否相等,不会比较其所指对象的具体内容。

class A{}
public class test1 {public static void main(String[] args) {A a1 = new A();A a2 = new A();//返回falseSystem.out.println(a1 == a2);//报错System.out.println(a1 > a2);//报错System.out.println(a1 < a2);}
}

三、三种自定义比较的方式

1、重写equals()方法

如果我们想判断两个引用对象的内容是否相等,我们可以调用equals()方法。这个方法定义在Object类中,而我们的类都继承了Object类。所以我们自己定义的类都可以使用这个方法。

但如果我们不在自定义类中重写这个方法的话,这个方法默认实现的也是对两个引用对象地址的比较。
默认实现如下:

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

但这里有一个例外,就是我们的String类型,这个类比较特殊,这个类的内部已经重写了equals()方法,其重写后就是在比较字符串中的具体内容。

比如下面的代码:

class Card {public int rank;public String suit;@Overridepublic boolean equals(Object obj) {// 自己和自己比较if(this == obj)return true;//o如果是null对象,或者o不是Card的子类if(obj == null || !(obj instanceof Card))return false;//注意基本类型可以直接比较,但引用类型最好调用其equal方法Card c = (Card) obj;return this.rank == c.rank && this.suit.equals(c.suit);}
}

但是我们发现重写equals方法只能够比较两个对象是否相等,其大小关系我们是比较不了的。所以如果我们想要比较两个引用对象的大小关系,我们就需要使用到下面的两种方法了。

2、基于Comparble接口比较

Comparble是一个Java提供的接口,这个接口的源码如下:

public interface Comparable<E> {int compareTo(E o);// 返回值:// < 0: 表示 this 指向的对象小于 o 指向的对象// == 0: 表示 this 指向的对象等于 o 指向的对象// > 0: 表示 this 指向的对象大于 o 指向的对象
}

如果我们想自定义比较两个类的大小关系的话,只需要让我们写的类实现这个接口即可。

示例如下:

class Card implements Comparable<Card>{public int rank;public String suit;@Overridepublic boolean equals(Object obj) {// 自己和自己比较if(this == obj)return true;//o如果是null对象,或者o不是Card的子类if(obj == null || !(obj instanceof Card))return false;//注意基本类型可以直接比较,但引用类型最好调用其equal方法Card c = (Card) obj;return this.rank == c.rank && this.suit.equals(c.suit);}@Overridepublic int compareTo(Card o) {return this.rank - o.rank;}
}

那么当我们需要比较两个类的大小关系的时候,直接调用compareTo()成员函数即可。

//p,q为Card类型的实例化对象。
System.out.println(p.compareTo(q));

3、基于Comparator比较器进行比较

Comparator比较器也是Java提供的一个接口,其实现如下:

public interface Comparator<T> {int compare(T o1, T o2);// 返回值:// < 0: 表示 o1 指向的对象小于 o2 指向的对象// == 0: 表示 o1 指向的对象等于 o2 指向的对象// > 0: 表示 o1 指向的对象等于 o2 指向的对象
}

这个比较器和第二个比较器的使用方法是不同的,这个接口并不是由我们的自定义类实现,而是我们要在定义一个专门的接口实现类来实现这个接口。

比如:

class Card {public int rank;public String suit;
}
class CardComparator implements Comparator<Card>{@Overridepublic int compare(Card o1, Card o2) {if(o1 == o2)return 0;if(o1 == null)return -1;if(o2 == null)return 1;return o1.rank - o2.rank;}
}

那么如何使用呢?
此时我们就需要实例化一个CardComparator比较器的对象,然后利用这个实例化之后的对象去调用这个方法,在方法中传入我们相比较的两个对象即可。

// 定义比较器对象
CardComparator cmptor = new CardComparator();
//p,q是两个Card类型的实例化对象
System.out.println(cmptor.compare(p, q));

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

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

相关文章

C#核心之面向对象-继承

面向对象-继承 文章目录 1、继承的基本规则1、基本概念2、基本语法3、示例4、访问修饰符的影响5、子类和父类的同名成员 2、里氏替换原则1、基本概念2、is和as3、基本实现 3、继承中的构造函数1、基本概念2、父类的无参构造函数3、通过base调用指定父类构造 4、万物之父和装箱拆…

关于ESP32下载的几个小问题

文章目录 一、没有收到串口数据二、vscode使用jtag烧录失败 在使用esp32的时候&#xff0c;下载遇到了这么几个小问题&#xff0c;写一下解决方法。 一、没有收到串口数据 报错如下&#xff1a; 这是在使用arduino下载的时候出现的错误&#xff1a;A fatal error occurred: …

Shell命令和基础学习

Shell的作用&#xff1a; 解释执行用户输入的命令或程序等用户输入一条命令&#xff0c;shell就解释一条键盘输入命令&#xff0c;Linux就给出响应的方式&#xff0c;称为交互式 外层应用程序 -> shell解释器 -> 操作系统核心 -> 机器硬件 shell脚本&#xff1a; wi…

c++多线程2小时速成

简介 c多线程基础需要掌握这三个标准库的使用&#xff1a;std::thread,std::mutex, andstd::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::th…

Web Component fancy-components

css-doodle 组件库 fancy-components 组件库使用 yarn add fancy-components使用&#xff1a; import { FcBubbles } from fancy-components new FcBubbles() //要用哪个就new哪个 new 这里可能会报错eslink,eslintrc.js中处理报错 module.exports {rules: {no-new: off} …

日志审计系统在提高网络安全方面具有哪些重要的作用

随着信息技术的飞速发展&#xff0c;我们正处于一个高度互联、数据驱动的网络时代。在这个时代&#xff0c;日志审计系统作为网络安全和信息管理的重要工具&#xff0c;发挥着至关重要的作用。下面德迅云安全就详细介绍下关于日志审计系统在当今网络时代的重要性。 一、什么是日…

四、Redis五种常用数据类型-List

List是Redis中的列表&#xff0c;按照插入顺序保存数据&#xff0c;插入顺序是什么样的&#xff0c;数据就怎么保存。可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含232-1个元素(4294967295&#xff0c;每个列表超过40亿个元素)。是一种双向列表结构…

Redis单机安装

1.编译 cd redis安装目录 makemake install2.修改配置文件redis.conf #端口修改 port 6379 #后台进程启动 yes daemonize yes # daemonize no #注释掉 为了可以远程连接 #bind 127.0.0.1 #设置密码 requirepass pwd3.启动 ./redis-server ../redis.conf查看进程 [rootlocal…

使用Maven对Java独立应用程序进行编译打包

一、 安装Maven 1.解压&#xff0c;移动安装包 sudo tar -zxf ~/apache-maven-3.9.6-bin.tar.gz -C /usr/local/ cd /usr/local/ sudo mv apache-maven-3.9.6/ ./maven-3.9.6 sudo chown -R qiangzi ./maven-3.9.6 二、Java应用程序代码 1.版本信息&#xff1a; Spark-2.1…

Python机器翻译包Translate:多语种翻译利器

Python机器翻译包Translate&#xff1a;多语种翻译&#xff0c;效果卓越&#xff01; 随着全球化的不断深化&#xff0c;跨语言沟通成为人们越来越重要的需求。而如今&#xff0c;Python作为一种功能强大的编程语言&#xff0c;正以其独特的优势和实用性&#xff0c;在机器翻译…

设计软件有哪些?渲染软件篇(1),渲染100邀请码1a12

做设计要用到很多软件&#xff0c;今天我给大家介绍一些渲染方面的&#xff0c;仅供参考。 1、渲染100(http://www.xuanran100.com/?ycode1a12) 渲染100是网渲平台&#xff0c;为设计师提供高性能的渲染服务。通过它设计师可以把本地渲染移到云端进行&#xff0c;速度快价格便…

APP广告变现:自刷的秘密与规则

在移动互联网时代&#xff0c;广告已成为众多APP盈利的主要方式之一。对于开发者和运营者而言&#xff0c;如何通过广告变现提高收益是他们必须关注的问题。然而&#xff0c;在众多的变现方法中&#xff0c;“自刷广告”这一概念可能让一些人感到迷惑。实际上&#xff0c;只要在…

高频SQL 第二高的薪水

题目信息 Employee 表&#xff1a; ------------------- | Column Name | Type | ------------------- | id | int | | salary | int | ------------------- 在 SQL 中&#xff0c;id 是这个表的主键。 表的每一行包含员工的工资信息。查询并返回 Employee 表…

巨资回流,量子投资热潮再起

一股新的信心和资金浪潮正在席卷量子计算产业。 2023年4月30日&#xff0c;澳大利亚联邦政府和昆士兰州政府宣布共同出资9.4亿澳元&#xff08;约合6.2亿美元&#xff09;&#xff0c;支持美国初创企业PsiQuantum在布里斯班附近建设一台大型量子计算机。这项投资是最新的迹象之…

字符串的赋值

因为字符串本质上就是数组&#xff0c;因此它的赋值也具有数组的特点&#xff1a;只能在初始化时用等号。 1&#xff0e;字符串的初始化 方法一&#xff1a;指定大小 char s[6]"Hello"; //指定字符串最大占用6个的char型内存单元 虽然看上去是将整个字符串赋给了…

RT-IoT2022 数据集-扩展数据(自制方法)

数据集官网Discover datasets around the world!https://archive.ics.uci.edu/dataset/942/rt-iot2022RT-IoT2022 是源自实时物联网基础设施的专有数据集&#xff0c;作为集成了各种物联网设备和复杂网络攻击方法的综合资源而引入。该数据集包含正常和对抗性网络行为&#xff0…

modbus协议完整介绍

一、MODBUS通讯协议完整介绍&#xff08;全文10000字以上&#xff09; - 知乎 modbus协议之-01-初次见面_一个寄存器有几个字节-CSDN博客

基于ConvNeXt网络的图像识别

1、前言 ConvNeXt 网络基于传统的卷积神经网络&#xff0c;与当下 transformer当道而言简直是一股清流 ConvNeXt并没有特别复杂或者创新的结构 ConvNeXt 网络有五种大小&#xff0c;可以参考下面 2、项目实现 完整的项目如下&#xff1a; 这里参考了网上的ConvNeXt 模型&…

Springboot+Vue项目-基于Java+MySQL的个人云盘管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

js知识库

script标签的async和defer作用及区别 1&#xff09;都会起到延迟执行js的作用 2&#xff09;defer&#xff1a;先进行html解析&#xff0c;解析过程中会下载js文件&#xff0c;但不会执行&#xff1b;当html完全解析完&#xff0c;才会执行js部分。多个用defer修饰的js是顺序…