`
supportopensource
  • 浏览: 522058 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

==运算符与equals()方法

阅读更多
1、“==”运算符
(1)比较基本数据类型变量
当两个基本数据类型的操作元通过“==”运算符比较是否相等时,比较的是这两个操作元的值是否相等,如果相等结果为True,否则为False,在比较时不考虑操作元的数据类型。
例如:
int i = 98;
int j = -98;
float f = 98.0f;
System.out.println(i==j);         //输出结果:false
System.out.println(i==f);         //输出结果:true
System.out.println(i=='b');        //输出结果:true
System.out.println(j==-'b');       //输出结果:true

(2)比较引用类型变量
当两个引用类型的变量通过“==”运算符比较是否相等时,比较的是这两个变量是否引用同一个对象,如果是结果为True,否则为False。
例如:
Integer num1 = new Integer(100); //创建一个Integer对象,并通过num1变量进行引用
Integer num2 = new Integer(100);//创建另一个Integer对象,并通过num2变量进行引用
System.out.println(num1==num2);//输出结果:false
System.out.println(num1!=num2);//输出结果:true

代码中虽然变量num1与num2引用的Integer对象的值都为100,但它们却是两个不同的对象,因此表达式“num1==num2”进行比较的结果为False。
下面将以上的代码进行修改:
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
num1 = num2;  //将num2引用的对象赋值给num1,使得这两个变量引用同一个对象
System.out.println(num1==num2);  //输出结果:true
System.out.println(num1!=num2);  //输出结果:false

下面通过“==”运算符向读者介绍Java包装类的自动装箱与拆箱的相关知识。先来看下面的代码:
Integer num1 = 280;//将自动进行280转换为Integer对象的装箱操作
Integer num2 = 280;//将自动进行280转换为Integer对象的装箱操作
System.out.println(num1==num2);//输出结果:false

代码中的变量num1与num2分别引用了两个对象,根据“==”运算符的比较规则,只有两个变量引用的是同一个对象时,比较的结果才为True,因此结果为False是正确的。
下面将代码进行如下修改:
Integer num1 = 80;//将自动进行80转换为Integer对象的装箱操作
Integer num2 = 80;//将自动进行80转换为Integer对象的装箱操作
System.out.println(num1==num2);//输出结果:true

这两段代码几乎是一样的,只不过改动了后者的数值,返回的结果却是True,这是因为Java包装类在进行自动装箱及拆箱时隐藏了一些细节上的操作。
Java在执行包装类的自动装箱功能时,对于-128~127之间的整数(包括-128与127)被装箱为Integer对象后,该对象会被另一个对该整数进行自动装箱的操作重复使用,即多次对同一个-128~127范围内的整数进行Integer装箱的操作,使用的都是第一次进行装箱操作时生成的对象,因此在进行“==”比较时,返回的结果是True。如果对超出这个范围内的整数进行装箱操作,那么对该整数的每次的Integer装箱操作都会生成一个新的Integer对象,因此在进行“==”比较时,比较的是不同的对象,返回的结果为False。
应用“==”运算符进行比较的两个引用类型的变量,其被显式声明的类型必须相同或者具有继承关系,否则编译会出错。
例如:存在A、B、C3个类,B、C类都继承自类A。变量myA被显式声明为A类型,变量myB被显式声明为B类型,变量myC被显式声明为C类型,变量D被显式声明为A类型但引用了类B的对象,变量myE被显式声明为A类型但与变量myB引用了同一个对象。
A myA = new A();//变量myA被显式声明为A类型
B myB = new B();//变量myB被显式声明为B类型
C myC = new C();//变量myC被显式声明为C类型
A myD = new B();//变量D被显式声明为A类型但引用了类B的对象
A myE = myB;//变量myE被显式声明为A类型但与变量myB引用了同一个对象
System.out.println(myA==myB);//输出结果:false
System.out.println(myA==myD);//输出结果:false
System.out.println(myC==myD);//输出结果:false
System.out.println(myB==myD);//输出结果:false
System.out.println(myB==myE);//输出结果:true

如果在上述代码中加入如下代码来输出变量myB与变量myC的比较结果,则编译出错。
System.out.println(myB==myC);//编译出错

因为变量myB与变量myC分别引用的是类B与类C的对象,而类B与类C的类型不同,并且没有继承关系,所以不能通过“==”运算符进行比较运算。
数组引用类型间也可以通过“==”运算符进行比较,例如:
float f1[] = {1.1F,2.2F,3.3F};
float f2[] = {1.1F,2.2F,3.3F};
float f2[] = null;
double d[] = {1.1,2.2,3.3};
System.out.println(f1==d);//编译出错,类型不同
System.out.println(f1==f2);//编译成功,结果为false
System.out.println(f3==f1);// 编译成功,结果为false
f3 = f1;
System.out.println(f3==f1);// 编译成功,结果为true

2、equals()方法
通常,Java中的类都继承自java.lang.Object类,在Object类中定义了一个equals()方法,其源代码如下:
public boolean equals(Object obj){
	return (this == obj);
}

根据源代码可知,equals()方法的比较规则实际上就是“==”运算符的比较,当参数obj引用的对象与当前对象(即调用equals()方法的对象)为同一个对象时,返回True值,否则返回False值。
例如:
A objA1 = new A();
A objA2 = new A();
A objA3 = objA1;                     //变量objA3与变量objA1引用同一个对象
System.out.println(objA1==objA2);       //输出结果:false
System.out.println(objA1.equals(objA2));  //输出结果:false
System.out.println(objA1==objA3);       //输出结果:true
System.out.println(objA1.equals(objA3));  //输出结果:true

在JDK中提供的一些类重写了Object类中的equals()方法,重新定制了比较规则,如果两个对象的类型一致,并且内容相同(不能同时为null),则返回True。这些类包括包装类、String和java.util.Data等。
下面给出Integer包装类中equals()方法的源代码:
public boolean equals(Object obj){
	if(obj instanceof Integer){//判断obj引用的对象是否为Integer类的实例
	return value == ((Integer)obj).inValue();//判断obj引用的对象是否与当前对象的内容相同
}
return false;
}

其中,instanceof用来判断一个引用变量所引用的对象是否为一个类的实例。
例如:变量num1与num2分别引用了两个不同的Integer对象,但它们的内容都是100,因此使用“==”运算符进行比较的结果为False,使用equals()方法进行比较的结果为True;变量date1与date2分别引用了两个不同的java.util.Data类对象,但它们的内容都是当前系统时间,因此结果同上。
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
Date date1 = new Date();                //创建一个Date()对象,值为系统当前时间
Date date2 = new Date();                //创建另一个Date()对象,值为系统当前时间
System.out.println(num1==num2);        //输出结果:false
System.out.println(num1.equals(num2));   //输出结果:true
System.out.println(date1==date2);        //输出结果:false
System.out.println(date1.equals(date2));   //输出结果:true

在比较字符串是否相等时,为了能够正确得到预期的运行结果,应该采用equals()方法进行比较。
例如:
String name = "liqiong";
if(name=="liqiong")
		System.out.println("登陆成功!");
else
		System.out.println("登陆失败!");

运行结果如下:
登陆成功!
虽然上述代码的运行结果与预期的相同,但如果将代码中的第一行进行修改:
String name = new String("liqiong");

则得到如下结果:
登陆失败!
在实际编程中,变量name的值很可能是通过参数传递的,并且该参数可能是一个String型的字面常量或者是String型对象,因此通过“==”进行比较时会得到两种结果,需要应用equals()方法来比较字符串是否相等。

在自定义的类中也可以重写Object类中的equals()方法,重新定制比较规则。例如创建了一个Student类用来封装学生信息,其中包含一个String型的number属性,该属性存储学生学号。如果想定义两个Student类对象的number属性内容相同,则表示这两个对象存储的是同一个学生的信息的比较规则,通过equals()方法实现时,就可进行如下定义:
public class Student{
	private String number;
	public Student(String number){
		this.number = number;
	}
	public boolean equals(Object obj){
		if(this == obj){
			return true;
		}
		if(obj instanceof Student){
			if((this.number).equals(((Student)obj).number))
				return true;
		}
		return false;
	}
}

然后通过构造方法创建两个Student类对象,它们的number属性都被赋值为字符串“1001”,并分别通过变量st1与st2引用这两个对象,则应用equals()方法比较这两个对象的结果为True。
Student st1 = new Student("1001");
Student st2 = new Student("1001");
System.out.println(st1==st2);       //输出结果:false
System.out.println(st1.equals(st2));  //输出结果:true

分享到:
评论

相关推荐

    系统管理 - PowerShell-7.5.0-win-x64.exe离线安装包 - 兼容Win10/Win11的跨平台运维解决方案

    1.【内容概要】 微软官方原版PowerShell 7.5.0 x64离线安装包,集成「三件套」企业级解决方案: [1.1] 智能环境配置脚本(自动修复.NET 6依赖/注册表权限); [1.2] 运维增强组件包(SSH远程管理+日志审计模块); [1.3] 跨平台脚本兼容方案(支持Linux/Windows混合执行); 2.【适用人群】 [2.1] 运维工程师:需批量管理Windows Server集群; [2.2] ​全栈开发者:构建CI/CD自动化流水线; ​ [2.3] 系统管理员:解决PowerShell 5.1模块兼容性问题; [2.4] ​IT培训机构:教学环境快速统一部署; 3.【使用场景】 [3.1] 企业内网部署,离线安装+环境自动初始化,内置AutoDeploy.cmd脚本。 [3.2] 跨平台脚本开发,同时操作Linux/Windows设备,集成OpenSSH Client 8.6。 [3.3] 高危操作防护,防止误执行危险命令,内置SafeMode沙箱模块。 4. 【使用目标】快速

    AUTOSAR以太网状态管理器(EthSM)解析:通信架构、状态机与应用实例

    内容概要:本文深入探讨了AUTOSAR以太网状态管理器(EthSM),涵盖其在AUTOSAR分层架构中的位置、主要职责、架构设计、接口定义及依赖关系,并详述状态机的具体状态、转换规则与事件处理流程。同时提供了详细的通信序列图解,帮助理解初始化及启动闭合通信等关键过程,并介绍了配置参数设置和错误处理方式。 适合人群:具备嵌入式系统或汽车电子背景的研发人员和技术管理人员。 使用场景及目标:适用于理解和设计复杂的车内以太网通信系统,尤其是基于AUTOSAR平台的开发项目。帮助技术人员掌握以太网状态的管理和故障排查方法,提高车载通信系统的可靠性。 阅读建议:由于内容专业性较强,建议读者对AUTOSAR基础知识有一定了解后再行阅读,在实践中逐步掌握各个概念和知识点的应用技巧,特别注意状态切换的实际案例分析。

    特易通国产对讲机TH-UVF9D v1.0中英写频软件

    特易通国产对讲机TH-UVF9D v1.0中英写频软件

    数据库_多线程_结构文档_生成工具_1741868776.zip

    数据结构学习

    信息资源整合及应用服务平台的需求规格说明书-系统架构与功能实现详解

    内容概要:该文档是一份关于‘信息资源整合及应用服务平台’需求规格说明书的详尽描述,涵盖项目的总体介绍、业务分析、系统需求、功能模块需求和部署环境等多个方面。文中明确了项目目标是对异构信息资源进行全面整合,并提供了详细的架构设计,确保用户在统一平台上享受高效的资源配置和服务体验。此外还介绍了平台的关键技术工具如TRSWCM和HyBase的使用,及各子系统间协作流程,强调了信息收集渠道多样化及其智能化管理水平。 适用人群:面向项目建设方(即负责系统建设和部署的组织或团队),相关用户和技术人员。 使用场景及目标:为建设‘信息资源整合及应用服务平台’提供建设指导和功能需求分析,明确项目范围、质量标准及开发任务分工;同时有助于相关人员更好地理解该平台的工作机制和应用场景。其他说明:此需求说明书亦可用于指导平台未来的维护和技术升级工作。 其他说明: 包含对系统管理、登录管理、日志管理等多个模块的详细说明,并对每个模块的功能进行了细致划分与介绍。文档末尾附带需求跟踪矩阵,用来监测各个阶段的任务完成情况和进度管理。

    java-springboot+vue家居日用小百货交易网站实现源码(项目源码-说明文档).zip

    系统基于Spring Boot+Vue.js的B/S架构,采用RESTful API实现前后端解耦,MySQL数据库配合MyBatis-Plus ORM框架构建高性能数据层。通过Spring Boot模块化设计、Vuex状态管理及Element UI组件库,实现开发效率与可维护性双提升,结合数据库索引优化与读写分离机制,保障系统高并发处理能力与扩展性。

    数据结构_算法库_句芒_Morn高效通用处理用途_1741872053.zip

    数据结构学习

    hello-java-maker_JavaInterview_1741864831.zip

    操作系统学习

    算法_数据结构_慕课网_学习代码库_CPP实现用途_1741873499.zip

    数据结构学习

    特易通国产对讲机TH-UV8000D v1.0中英写频软件

    特易通国产对讲机TH-UV8000D v1.0中英写频软件

    数字化为企业节能降碳提供新动能【22页】.pptx

    数字化为企业节能降碳提供新动能【22页】

    动物园异常现象解析:基于游客与员工守则揭示神秘逃脱规则

    内容概要:本文以某动物园的游客守则、员工守则以及海洋馆的特殊告示为主要框架,呈现了一个充满恐怖与诡异色彩的独特故事。故事围绕游客和员工的行为规范展开,通过种种奇怪的规定,揭示了一个超现实的环境,暗示存在某种未知实体'它’的操控或威胁,其中涉及到了诸如幻视、认知错乱等多种异象,并以‘唯一解’的形式设置了谜题等待解答,整个文本充斥着紧张悬疑氛围。 适用人群:适合喜爱恐怖悬疑风格作品的成人读者,尤其是对超自然题材感兴趣的文学爱好者。 使用场景及目标:①营造神秘惊悚感的故事叙述背景,探讨人性与现实感知之间的复杂关系;②提供解谜元素激发思考,吸引受众深入探究背后的真相。目标在于带给人们非同寻常的心理体验的同时,引导他们探索表象背后隐藏的意义,从而更好地理解作者构建这个世界观的核心意图所在。 其他说明:本文不仅是一份简单的守则指南,更是一场沉浸式的心理游戏,通过对细节的精心编排来增强故事的真实性和代入感。同时,文中提及多个关于兔子、白狮子、山羊等角色的信息交织形成了复杂的情节脉络,进一步增加了叙事深度。然而值得注意的是,尽管文章看似提供了逃生指引,但实际上并未给出明确的结局指向,使得每位读者都能根据自己对文本的理解得出不同的答案,这也是此类作品魅力之一。

    基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码(毕业设计&课程设计&项目开发)

    基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 检测当前的温度与心率,同时通过MPU6050检测老人是否摔倒 将摔倒信息发送给子女 基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 检测当前的温度与心率,同时通过MPU6050检测老人是否摔倒 将摔倒信息发送给子女 基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 检测当前的温度与心率,同时通过MPU6050检测老人是否摔倒 将摔倒信息发送给子女~

    机器学习入门(线性回归)波士顿房价预测代码

    机器学习入门(线性回归)波士顿房价预测代码

    特易通国产对讲机MD580 v1.0中英写频软件

    特易通国产对讲机MD580 v1.0中英写频软件

    后端开发_Go语言_面试题_学习资源_1741867880.zip

    数据结构学习

    2025年美赛全流程指南

    2025年美赛全流程指南

    数据结构_算法可视化_Unity_教育演示系统_1741873797.zip

    数据结构学习

    嵌入式系统下栈与队列方案的选择以及C语言实现

    内容概要:本文详细探讨了栈和队列这两种重要的线性数据结构在嵌入式系统中的C语言实现。首先介绍了栈和队列的基本概念及其存储结构,并结合实际应用场景讲解了这两种结构的操作实现方法。文章还针对嵌入式系统资源受限的特点对比了顺序栈、链栈、循环队列和链队列这四种常见形式的优点与缺点,重点讨论了在不同情况下哪种实现更适合。具体实现部分提供了详细的代码样例,并强调了性能优化策略,比如通过位运算加速取余操作,从而使得程序不仅符合理论标准还能高效地运行在特定硬件环境之中。 适合人群:嵌入式系统开发者和技术爱好者,尤其是希望深入理解栈与队列原理及其在嵌入式环境下优化策略的人士。 使用场景及目标:该文档可以帮助读者掌握如何基于不同的项目要求(如是否能预估最大容量或存在大量不定长数据等)来决定最适合的具体实现,同时通过动手编写和调试提供的示例代码加深理解栈与队列的工作机制及其在嵌入式编程中的应用场景。 其他说明:除了基础的栈和队列知识,本文件还将带领读者探索更深层次的主题,如内存管理、指针操纵及高效编码技巧等方面的内容。

    汽车电子领域的 AUTOSAR COM Based Transformer 架构分析及其实现细节

    内容概要:这篇文档深入剖析了 AUTOSAR 规范中重要的 COM Based Transformer 组件。首先对 COM Based Transformer 进行简述,并对其架构做了宏观概述;随后从配置层面详细解释它的结构和类之间的相互关系,并对它所涉及的重要类进行了逐项阐述;接着对内部构成、各部分功能以及外部接口做了细致入微的研究,尤其是针对其初始化机制、序列化能力及其反向工作的机理方面展开讨论;最后还展示了其具体操作过程以及状态变化情况,为理解和实施该模块提供了详实的支持。 适合人群:对于从事车载网络通信系统的开发者或研究人员来说非常有价值。 使用场景及目标:旨在帮助工程师们快速掌握 COM Based Transformer 在 AUTOSAR 平台下是如何运作的,进而提升他们构建高性能车载应用程序的能力。 阅读建议:为了能充分理解这篇技术报告的价值,强烈建议那些已经熟悉基本 AUTOSAR 结构的专业技术人员阅读此文。此外,在实际工程项目当中遇到有关此主题的问题之时可以随时查阅文中提到的概念和技术点来寻求解决方法。由于文中涉及到很多具体的接口和参数设定,请在实际开发过程中仔

Global site tag (gtag.js) - Google Analytics