问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java中对象的比较,让你的Coding更上一层楼

发布网友 发布时间:2024-10-01 15:58

我来回答

1个回答

热心网友 时间:2024-10-19 00:23

一:问题引出

在使用优先级队列(堆)的时候,优先级队列对插入的元素要求必须是可以互相进行比较的元素,并且不能是null。那么怎么比较自定义类的对象呢?

<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">

@TOC

二:Java中比较的几种方式

<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">

2.1在Java中基本类型可以直接进行比较publicclassTestCompare{publicstaticvoidmain(String[]args){inta=10;intb=20;System.out.println(a>b);System.out.println(a<b);System.out.println(a==b);charc1='A';charc2='B';System.out.println(c1>c2);System.out.println(c1<c2);System.out.println(c1==c2);booleanb1=true;booleanb2=false;System.out.println(b1==b2);System.out.println(b1!=b2);}}

输出结果:

对于基本类型,可以直接用’=’,’>’,‘<’等其他符号比较,返回true,或者是false。

2.2对象的比较1.引入classCard{publicintrank;//数值publicStringsuit;//花色publicCard(intrank,Stringsuit){this.rank=rank;this.suit=suit;}}publicclassTestPriorityQueue{publicstaticvoidmain(String[]args){Cardc1=newCard(1,"?");Cardc2=newCard(2,"?");Cardc3=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指向的是同一个对象}}

从结果中可以看出Java中引用类型的比较不能直接按照‘<’,’>’比较。编译器会报错,那为什么‘==’可以呢?因为对于自定义的类型,都默认的继承了Object类,而Object类中提供了equal方法,而‘==’默认情况下调用的就是equal方法,equal方法比较的并不是两个变量的值的大小,而是直接比较两个引用变量的地址。

三:对象的比较3.1覆写基类的equal方法

在2.2中自定义类型equal方法比较的是两个变量的地址而不是大小,那要是硬要比较大小应该怎么做呢?我们可以覆写基类的equal方法

@Overridepublicbooleanequals(Objecto){//自己和自己比较if(this==o){returntrue;}//o如果是null对象,或者o不是Card的子类if(o==null||!(oinstanceofCard)){returnfalse;}//注意基本类型可以直接比较,但引用类型最好调用其equal方法Cardc=(Card)o;returnrank==c.rank&&suit.equals(c.suit);}}

覆写的格式大同小异:

1.如果两个变量都指向同一个变量那么返回true;

2.如果有传入的变量为null,那么返回false;

3.如果传入的类型不同,(如上面的例子不是“card“),也返回false;

4.按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌

总结:覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。

<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">

3.2基于Comparble接口类的比较

对于自定义类型比较大小的话,在定义类的时候实现它的Comparble接口,然后在类中重写CompareTo方法Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

publicinterfaceComparable<E>{//返回值://<0:表示this指向的对象小于o指向的对象//==0:表示this指向的对象等于o指向的对象//>0:表示this指向的对象等于o指向的对象intcompareTo(Eo);}publicclassCardimplementsComparable<Card>{publicintrank;//数值publicStringsuit;//花色publicCard(intrank,Stringsuit){this.rank=rank;this.suit=suit;}//根据数值比较,不管花色//这里我们认为null是最小的@OverridepublicintcompareTo(Cardo){if(o==null){return1;}returnrank-o.rank;}publicstaticvoidmain(String[]args){Cardp=newCard(1,"?");Cardq=newCard(2,"?");Cardo=newCard(1,"?");System.out.println(p.compareTo(o));//==0,表示牌相等System.out.println(p.compareTo(q));//<0,表示p比较小System.out.println(q.compareTo(p));//>0,表示q比较大}}3.3基于比较器的比较

具体步骤如下:

1:自定义比较器类,实现Comparator接口

publicinterfaceComparator<T>{//返回值://<0:表示o1指向的对象小于o2指向的对象//==0:表示o1指向的对象等于o2指向的对象//>0:表示o1指向的对象等于o2指向的对象intcompare(To1,To2);}

2:覆写Comparator中的compare方法`

importjava.util.Comparator;classCard{publicintrank;//数值publicStringsuit;//花色publicCard(intrank,Stringthis.rank=rank;this.suit=suit;}}classCardComparatorimplementsC//根据数值比较,不管花色//这里我们认为null是最小的@Overridepublicintcompare(Cardo1,Cardo2){if(o1==o2){return0;}if(o1==null){return-1;}if(o2==null){return1;}returno1.rank-o2.rank;}publicstaticvoidmain(String[]args){Cardp=newCard(1,"?");Cardq=newCard(2,"?");Cardo=newCard(1,"?");//定义比较器对象CardComparatorcmptor=newCardComparator();//使用比较器对象进行比较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比较大}}3.4三种比较方式的对比

四:结尾

上面的就是java中常用的比较变量的方法,由于侵入性不同,需要跟需求选择。

Java中对象的比较,让你的Coding更上一层楼

publicinterfaceComparable&lt;E&gt;{//返回值://&lt;0:表示this指向的对象小于o指向的对象//==0:表示this指向的对象等于o指向的对象//&gt;0:表示this指向的对象等于o指向的对象intcompareTo(Eo);}publicclassCardimplementsComparable&lt;Card&gt;{publicintrank;//数值publicStringsuit;//花色publicCard(intrank,Stringsui...

线上编程培训机构排名前十

第二天我就联系老师去了学校,后来还对比了其他几家培训机构,最后我选择了咱们千锋,理由很简单:第一,当时千锋的课程和我想学的更匹配,教学方式我也喜欢;第二,我姐在这学的,她觉得千锋非常好,这给了我很大信心。后来和朋友聊天,发现迷茫的不只我一个人,我就带动我三个朋友一起报名学习UI。其实刚开始我们对自己...

网站崩溃的原因

优化CPU占用,启用浏览器防假死,和混合模式,然后重新启动浏览器看下,另外,建议你把你360浏览器升级到最新版,4.0这个版本更稳定,另外还有一个原因就是你的IE浏览器版本比较低,也会造成360浏览器的不稳定,因为360浏览器使用的是IE内核!

介绍几个你比较熟悉的设计模式,并简单介绍它们是如何实现的

在MPEG-1的基础上,MPEG-2标准在提高图像分辨率、兼容数字电视等方面做了一些改进,例如它的运动矢量的精度为半像素;在编码运算中(如运动估计和DCT)区分“帧”和“场”;引入了编码的可分级性技术,如空间可分级性、时间可分级性和信噪比可分级性等。近年推出的MPEG-4标准引入了基于视听对象(AVO:Audio-Visual Object)...

深入解读Python解析XML的几种方式

Element对象有一个iter方法,可以对某个元素对象之下所有的子元素进行深度优先遍历(DFS)。ElementTree对象同样也有这个方法。下面是查找XML文档中所有元素的最简单方法:&gt;&gt;&gt; for elem in tree.iter():... print elem.tag, elem.attrib...doc {}branch {'hash': '1cdf045c', 'name': 'codingpy.com'}branch...

java的装饰者模式中装饰类为什么不直接实现接口

装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。一、原理图 其中类的职责如下:抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象 具体构件角色(Employe):定义一个将要接收附加责任的类 ...

C++的学习方法!~

在结合基于对象和泛型设计这两种抽象设计模式的技术上诞生的工业产品就是---STL。 (二)书的诱惑 《C++程序设计语言》:如果你只买一本C++书,这本就是你的选择,作者Bjarne就是让你做出这样选择的全部理由,没有人能比他更了解什么样才是真正的使用C++编程了,有人说到这本书语言晦涩,或者对与初学者此书不适合,...

django中怎么添加验证码(2023年最新整理)

Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。 首先,写一个验证码生成帮助类,用来绘制随机字母: import?java.awt.Color; import?java.awt.Font; import?java.awt.Graphics; import?java.awt.image.BufferedImage; impor...

PSP掌上游戏机

个人感觉其功能更接近PC 显卡的Vertex Shader顶点着色器[注:什么是Vertex Shader(顶点着色器)——Vertex(顶点)是计算机图形学中的最基本元素,三个顶点可以连接成一个三角形形成一个面,在三维空间中,每个顶点都拥有自己的坐标(xyzw)和颜色值等数据,Vertex Shader(顶点着色器)在软件层上来说就是一系列对顶点数据进行...

如何学习C++编程

它会带你游览C++对象模型的底层实现机制。读完此书,任何C++代码看起来如同行云流水,必读。 2. 优秀的C/C++开源项目(阅读代码) OS:Linux kernel LVS、Linux应用程序 DB:Mysql、PostgreSQL Complier:VM、GCC Framework:OpenSip、SipProxy、 Net:ACE(Java Mina、Netty)、TCP/IP、HTTP协议栈 Cache:Memcached、Redis、 ...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么树最旺盛最长寿 索尼的E口镜头是什么意思? 傅里叶红外光谱仪主要特点 国考自动化属于哪一类 我想买—辆车,需要有7至8个座位的并能省油,最好是MPV或SUV的,排量在1.5... ...| 红外光谱FT-IR详解知识点汇总 内含中心测试实例 8座suv有哪些选择?老婆说想买个7座or8座的SUV。 牙齿不好怕跟男朋友接吻又味道该怎么办 接吻碰牙齿怎么办? 牙黄无朋友吗 spring类型(spring类型注入) 如何能免费获得360币?(^_^) 我是广西驾驶证大良违章处理去哪里办理? 在广西国道违章代码1636去那里处理 汽车违章扣了160分?是什么意思?我是广西的,在云南被扣,能否在广西交罚... 大乐透中一等奖后是不是还得等几天才能兑奖? 汽车广西南宁桂A39B62有几次违章了 淘金币退款会退吗[电商工具箱淘金币会过期吗] 浙江创发制衣有限公司怎么样? 会计专硕mpacc初试、复试经验分享? iOS 13的电池优化功能如何帮助提升iPhone续航? 苹果13很难充电到100 办公室装修过程中的网线布线施工和开关插座的安装注意事项介绍 孩子上一年级了,课堂上需要用到时钟模型做教具,他想让我给他做一个... 我是否可以问问有哪些难吃但是对身体有好处的东西? 如何防止别人偷看本地聊天记录 代谢性骨病的症状 如何防止QQ聊天记录泄露? 买电脑,什么配置的比较合适?主要从事建筑行业,经常使用CAD、BIM相关软... 手机支架导航怎么摆放才正确 ...一直按时保养,最近觉得油门有点肉,是什么问题?节气门不脏_百度知 ... 如何计算1+3+5+7+…+99? 怎样快速算出1、3、5、7、9……99? 1+3+5+7...+99=? 你觉得侠盗猎车手圣安地列斯游戏中的火车和坦克是不是非常厉害呀_百度... 判断1、3、5、7、9、………是什么数列?并求出数列的通项公式及前100项... 侠盗车手圣安地列斯什么武器能打坏坦克? 立秋的谚语 关于立秋的谚语 关于日本半导体单片式清洗设备制造商的推荐 东征西讨的近义词和反义词是什么_东征西讨是什么意思? ...角钢,H型钢,卷钢等,是怎么定义的,如何分类,谢谢了,急需! 买第二套房可以把第一套房抵押出去借第二套的首付吗 ...用第一套房抵押吗 买第二套房可以用第一套房抵押贷款吗 钢材分类是什么 钢材怎么分类 金丝玉手镯全红的好还是一半红一半白好 晚期乳腺癌的化疗是怎样的? 转移性三阴性乳腺癌的治疗进展 乳腺癌治疗现状是什么?有何新药新理念? NCCN 指南:晚期乳腺癌全身治疗 转移性乳腺癌有哪些治疗方案