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();
        //返回false
        System.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;

    @Override
    public 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;

    @Override
    public 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);
    }

    @Override
    public 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>{
    @Override
    public 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.mfbz.cn/a/597810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[综合应用]dns nfs httpd php mysql

第一步&#xff1a;搭建三台主机 主机名称 Ip地址 角色 503A 192.168.68.10 Mysql从 503B 192.168.68.11 Mysql从&#xff0c;nfs服务端&#xff0c;dns服务端 503Cmysql 192.168.68.12 MySQL主&#xff0c;web客户端 第二步&#xff1a;在503B上配置DNS 2.1 下载…

【3dmax笔记】027:配置修改器集、工具栏自定义与加载

文章目录 一、配置修改器集二、自定义工具栏三、加载工具栏 一、配置修改器集 可以把自己常用的修改命令放到右边框中的部分&#xff0c;便于自己的操作&#xff0c;省去了每次都要花半天时间找命令的尴尬。新建一个二维或者三维物体&#xff0c;点击修改面板&#xff0c;点击…

三分钟了解计算机网络核心概念-数据链路层和物理层

计算机网络数据链路层和物理层 节点&#xff1a;一般指链路层协议中的设备。 链路&#xff1a;一般把沿着通信路径连接相邻节点的通信信道称为链路。 MAC 协议&#xff1a;媒体访问控制协议&#xff0c;它规定了帧在链路上传输的规则。 奇偶校验位&#xff1a;一种差错检测方…

【含win+Mac整合包】本地部署Stable Diffusion,超详细(AI 绘画保姆级教程,100%成功部署)

什么是stable diffusion? stable diffusion是在2022年发布的基于扩散模型的文本到图像生成模型&#xff0c;起初它只有一堆api供开发者使用&#xff0c;可以说非常难上手&#xff0c;随着2023年5月由AUTOMATIC1111大佬基于SD API开发的SD WebUI的发布&#xff0c;SD第一次有了…

C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【运维自动化-配置平台】如何对主机进行纳管

主机是配置平台管控最常见的资源&#xff0c;也是运维日常主要的管控对象&#xff1b;如何对主机进行全生命周期管理呢导入主机 直接导入 直接导入仅适用于直连区域&#xff08;default area&#xff09;的主机&#xff0c;也就是网络跟蓝鲸平台能内网互通的。 资源–>主…

西奥机电食品质构分析仪:揭秘水果蔬菜硬度等指标的测试原理

西奥机电食品质构分析仪&#xff1a;揭秘水果蔬菜硬度等指标的测试原理 在食品科学领域&#xff0c;对水果蔬菜硬度的精准测量是评估其品质与口感的重要步骤。西奥机电食品质构分析仪凭借其先进的技术和独特的测试原理&#xff0c;为这一领域带来了革命性的变革。下面&#xf…

非标类型导致Dubbo接口出入参异常的本质 | 得物技术

一、概述 笔者支持过程中多次发现诡异的Dubbo接口异常问题&#xff0c;抓耳挠腮最后定位到代码上和代码外的原因&#xff0c;事后只感觉脑瓜子嗡嗡的。考虑到这不是第一次&#xff0c;也绝不会是最后一次出现类似问题&#xff0c;下面笔者将尽可能详细的梳理、总结一下该问题的…

6个月小猫成长必备!福派斯无麸质幼猫粮评测

你知道吗&#xff1f;给小猫选择适合的猫粮是一件非常不容易但很重要的事情。那么&#xff0c;对于6个月大的小猫来说&#xff0c;什么样的猫粮是最适合它们的呢&#xff1f;&#x1f431; 我们首先要考虑的是猫粮的营养成分。6个月大的小猫正处于快速生长期&#xff0c;所以需…

vue3 + ts实现canvas绘制的waterfall

实际运行效果(仅包含waterfall图表部分) component.vue <template><div ref="heatmap" :style="{ height: props.containerHeight + px }" /> </template><script setup> import ColorMap from "colormap"; import…

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…

掌控网络流量,优化网络性能 - AnaTraf网络流量分析仪登场

在当今日新月异的网络环境中,网络流量监控和性能诊断已成为企业IT部门不可或缺的重要工作。只有充分了解网络流量状况,才能有效优化网络性能,提高业务运营效率。针对这一需求,全新推出的AnaTraf网络流量分析仪应运而生,为企业提供全面的网络监控和性能诊断解决方案。 快速定位…

Java双亲委派机制

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 概述 Java程序在运…

pygame实现鼠标绘制并调节画笔大小

pygame实现鼠标绘制并调节画笔大小 pygame介绍调节画笔大小鼠标绘制效果 pygame介绍 Pygame是一个开源的Python库&#xff0c;专为电子游戏开发而设计。它建立在SDL&#xff08;Simple DirectMedia Layer&#xff09;的基础上&#xff0c;允许开发者使用Python这种高级语言来实…

C语言趣味代码(五)

我想以此篇结束关于C语言的博客&#xff0c;因为在C语言拖得越久越不能给大家带来新的创作&#xff0c;在此我也相信大家对C语言已经有了一个新的认知。进入正题&#xff0c;在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍&#xff0c;从测试版逐步改良&#x…

数据结构——图的基础知识与其表示

一&#xff1a;定义 由顶点的集合和边的集合组成&#xff1b;常以 G(V,E) 表示&#xff0c;G 代表图&#xff0c;V代表 顶点的集合&#xff0c;E代表边的集合&#xff1b; 如图&#xff1a; 在G1图中&#xff0c;有 0~4 五个顶点&#xff0c;有 0-1&#xff0c;0-2&…

专题五_位运算(2)

目录 面试题 01.01. 判定字符是否唯一 解析 题解 268. 丢失的数字 解析 题解 371. 两整数之和 解析 题解 面试题 01.01. 判定字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:bool isUnique…

Ubuntu上使用audit2allow解决Android Selinux问题

1.安装工具 sudo apt install policycoreutils 2.运行命令 提前用dmesg或者串口抓取kernel log 遇到错误&#xff0c;提示需要用-p指定policy file&#xff0c;然偶尝试创建一个policy空文件&#xff0c;用-p选项&#xff0c;遇到如下错误 3.规避问题 首先跟进错误log的堆栈…

面试集中营—Spring篇

Spring 框架的好处 1、轻量&#xff1a;spring是轻量的&#xff0c;基本的版本大约2MB&#xff1b; 2、IOC&#xff1a;控制反转&#xff0c;Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了&#xff0c;而是由容易来控制&#xff0c;一个字&#xff1a;爽&#xf…

leetcode-有重复数字的全排列-98

题目要求 思路 1.同【没有重复项的全排列-97】这个题一样&#xff0c;都是递归的题&#xff0c;区别在于这个可能会包含重复的数字&#xff0c;因此&#xff0c;不能只是简单的通过两个值是否相等然后用标志位标记&#xff0c;而是新增了一个数组&#xff0c;这个数组专门用于…
最新文章