java对象的比较

一.PriorityQueue中插入对象

优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,那优先级队列中能否插入自定义类型对象呢?

堆中插入元素时,必须要进行元素的比较,而此时Card是没有办法直接进行比较的,因此会抛出异常

二.元素的比较

1.基本元素类型的比较

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

2.对象比较的问题

public class Card {
    public int rank; //数值
    public String suit; //花色

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}

public class Test{
    public static void main(String[] args) {
        Card c1 = new Card(1,"♥");
        Card c2 = new Card(1,"♥");
        Card c3 = c1;
        //System.out.println(c1 > c2);  编译报错
        System.out.println(c1 == c2); //打印false,因为c1和c2指向的是不同的对象
        //System.out.println(c1 < c2);编译报错
        System.out.println(c1 == c3); //打印true,应为c1和c3指向同一个对象
        System.out.println(c1.equals(c2)); //打印false,因为c1和c2指向的是不同的对象

    }
}

三.对象的比较

有些情况下,需要比较对象中的内容

1.覆写基类的equals(比较是否相等)

右键生成equls重写方法

public class Card {
    public int rank; //数值
    public String suit; //花色

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;
        Card card = (Card) object;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }   
}
public class Test{
    public static void main(String[] args) {
        Card c1 = new Card(1,"♥");
        Card c2 = new Card(1,"♥");
        Card c3 = c1;
        //System.out.println(c1 > c2);  编译报错
        System.out.println(c1 == c2); //打印false,因为c1和c2指向的是不同的对象
        //System.out.println(c1 < c2);编译报错
        System.out.println(c1 == c3); //打印true,应为c1和c3指向同一个对象
        System.out.println(c1.equals(c2));//打印true,因为c1和c2里面的内容一致
        System.out.println(c1.rank == c2.rank);//打印true,因为rank相同
    }
}

2.基于Comparble接口类的比较(比较大小)

源码实现:

对于用户自定义类型,如果要按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法

public class Card implements Comparable<Card>{
    public int rank; //数值
    public String suit; //花色

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    //根据数值比较,不管花色
    //这里我们认为null是最小的
    @Override
    public int compareTo(Card o) {
    if (o == null){
        return 1;
    }
    return this.rank - o.rank;
    }
}
public class Test{
    public static void main(String[] args) {
        Card p = new Card(1,"♥");
        Card q = new Card(2,"♥");
        Card o = new Card(1,"♥");
        System.out.println(p.compareTo(o));//==0,表示牌相等
        System.out.println(p.compareTo(q));//<0,表示p比较小
        System.out.println(q.compareTo(p));//>0,表示q比较大
        //System.out.println(q > p);//编译错误
    }
}

Compareble是Java.lang中接口,可以直接使用

3.基于比较器比较

按照比较器进行比较,具体步骤如下:

  • 用户自定义比较器类,实现Comparator接口
public interface Comparator<T> {
    //返回值
    //<0表示o1指向的对象小于o2指向的对象
    //==0表示o1指向的对象等于o2指向的对象
    //>0表示o1指向的对象大于o2指向的对象
    int compare(T o1, T o2);
}

注意区分Comparator和Comparable

  • 覆写Comparator中的compare方法
public class CardComparator implements Comparator<Card>{
    //根据数值比较,不管花色
    //这里我们认为null是最小的
    @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;
    }
}
public class Test{
    public static void main(String[] args) {
        Card p = new Card(1,"♥");
        Card q = new Card(2,"♥");
        Card o = new Card(1,"♥");
        //定义比较器对象
        CardComparator cmptor = new CardComparator();

        //使用比较器对象进行比较
        System.out.println(cmptor.compare(p,o));//==0,表示牌相等
        System.out.println(cmptor.compare(p,q));//<0,表示p比较小
        System.out.println(cmptor.compare(q,p));//>0,表示q比较大
    }
}

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

4.三种方式对比

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

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

相关文章

Java入门-java的集合框架

集合概念 集合&#xff0c;有时也称作容器(Container), 是对象的持有者&#xff0c;它们可以有助于高效访问的方式存储的组织对象。以生活中的案例为例&#xff1a; 集合就像装衣服的柜子&#xff0c;衣服就是集合中的元素。 集合框架图 Collection中每次操作的都是一个对象&a…

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测

目前现状 无法客观、方便地掌握护林员的到位情况&#xff0c;因而无法有效地保证巡护人员按计划要求&#xff0c;按时按周期对所负责的林区开展巡护&#xff0c;使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理&#xff0c;现场状况、位置等信息描述…

pycharm打开服务器(linux)上的项目

先在本地打开项目 一、项目文件配置 tools-deployment-configuration 新增一个sftp连接 测试服务器是否可以连通 mappings中设置本地路径和服务器上的路径 二、环境配置 先参考文章 复现论文的conda环境&#xff08;win和联网、离线linux&#xff09;_conda复现环境-CSDN博…

Qt pro工程文件编写汇总(区分debug和release、32位和64位的方法,编译输出目录等)

前言&#xff1a; 从事qt开发已经好几年了&#xff0c;但有关pro编写的一些细节问题一直没有一个很好的梳理汇总——因为实际工作开发中&#xff0c;往往只需要编译特定版本的软件&#xff08;例如32位release版本&#xff09;&#xff0c;项目创建好后并设置好编译路径&#x…

美团Java社招面试题真题,最新面试题

如何处理Java中的内存泄露&#xff1f; 1、识别泄露&#xff1a; 使用内存分析工具&#xff08;如Eclipse Memory Analyzer Tool、VisualVM&#xff09;来识别内存泄露的源头。 2、代码审查&#xff1a; 定期进行代码审查&#xff0c;关注静态集合类属性和监听器注册等常见内…

逻辑分析仪的调试使用

调试软件下载&#xff1a;点击跳转 一、接线 逻辑分析仪 设备 GND --- GND CHX&#xff08;数据通道&#xff09; --- 通信引脚 二、数据采集 图中两个可以选择数字大小的地方分别表示 采样深度 &#xff08;10M Samples&a…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构&#xff0c;成为了人们构建代码的基础。你可以使用定义常…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

xml篇---提取VOC格式的坐标,并按照cameraID进行排序(二)

xml篇—提取VOC格式的坐标&#xff0c;并按照cameraID进行排序&#xff08;二&#xff09; import os import xml.etree.ElementTree as ETdef parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot()objects {}for obj in root.findall(object):name obj.find(…

使用ResNet-50训练自己的数据集(花的种类)

1.数据集处理 具体操作 1.把不同类别的花&#xff08;或者自己数据集的不同类别&#xff09;放在不同的文件夹下 2.文件夹名字是花朵类别 代码预处理 # 对数据集进行处理 import os from shutil import copy import randomdef mkfile(file):if not os.path.exists(file):os…

简易计算器

前言 简易计算器&#xff0c;旨在实现一个简单的计算器功能。 整形&#xff0c;浮点型数据的加减乘除运算&#xff1b;数据的统计(如文件中某字符的出现频数)&#xff1b;期望&#xff0c;方程运算&#xff1b;平均数&#xff0c;最小值&#xff0c;最大值&#xff0c;中位数…

每日5题Day11 - LeetCode 51 - 55

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>…

揭秘订单排队模式:社交电商新策略

随着移动互联网的蓬勃发展&#xff0c;社交电商正以其独特的魅力席卷全球。据权威机构预测&#xff0c;到2024年&#xff0c;全球社交电商市场规模有望达到惊人的2.8万亿美元。面对如此庞大的市场蛋糕&#xff0c;如何精准把握机遇&#xff0c;实现业务的跨越式增长&#xff0c…

SQL157 平均播放进度大于60%的视频类别

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:30011NULL210220012021-10-01 10:00:002021-10-01 10:00:21001NULL310320012021-10-01 11:00:502021-10-01 11:01…

强大的医院绩效考核管理系统源码,支持行业内所有绩效方案,且每步核算都可自主进行方案的新建、调整。

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件源码。 系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统…

定时调度任务——kettle开发22

一、流查询 流查询在查询前把数据加载到内存中&#xff0c;并且只能进行等值查询。 流查询的操作包括指定数据源&#xff0c;即我们将数据进行流查询的数据源头&#xff0c;如下图所示流查询的数据源是我们的Excel输入-departments&#xff0c;然后我们还需要指定我们进行流查…

手机远程协助,3个方法,开启沟通新篇章

已经不仅仅是一个通讯工具&#xff0c;更是一个多功能的魔法棒。它轻轻一挥&#xff0c;就能让我们跨越千山万水&#xff0c;与亲朋好友、合作伙伴进行亲密无间的交流。今天&#xff0c;就让我们一起探讨如何利用手机远程协助的三大法宝&#xff0c;开启沟通的新篇章&#xff0…

二叉树——堆的实现

一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构&#xff1a;https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构&#xff0c;以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…

手动操作很麻烦?试试这个自动加好友神器吧!

你是不是也觉得手动逐一输入号码或是微信号&#xff0c;再搜索添加很麻烦&#xff1f;试试这个自动加好友神器——个微管理系统&#xff0c;帮助你省去繁琐的手工操作&#xff0c;节省时间和精力。 首先&#xff0c;在系统上登录微信号&#xff0c;无论你有多少个微信号&#…

服务器重装系统与磁盘操作

诱因&#xff1a;服务器原来装的EXSI&#xff0c;现在要重装一个ubuntu server&#xff0c;出现了下面一些问题&#xff0c;在此记录一下。 目录 1、过程中出现的问题&#xff08;2024.5.26&#xff09;1.1 问题1&#xff1a;如何磨掉原来的ESXI&#xff1f;1.2 问题2&#xf…