Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于Java中==与equals的解析

关于Java中==与equals的解析

作者头像
大黄大黄大黄
发布于 2018-09-14 09:48:13
发布于 2018-09-14 09:48:13
49900
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/73497268

在我们初学Java时,可能会经常碰到下面的代码:

运行结果如下:

  也许你会很困惑,为什么输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下==和equals方法的区别之处。

一.关系操作符“==”到底比较的是什么?

  下面这个句话是摘自《Java编程思想》一书中的原话:

关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。

  在Java中拥有8种基本数据类型:

浮点型:float(4 byte), double(8 byte) 整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte) 字符型: char(2 byte) 布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”)

  对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1)。   也就是说比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int n=3;
int m=3; 

  变量n和变量m都是直接存储的”3”这个数值,所以用==比较的时候结果是true。

  而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。比如下面这行代码:  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 String str1;

  这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。而通过new String(“hello”)来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 str1= new String("hello");

  那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串”hello”。这里面的引用和C/C++中的指针很类似。   因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。   而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

总结来说:

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。 2)对于equals不能作用于基本数据类型的变量(如:不能写成 int m=1;int n=1;n.equals(m);)如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年06月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 System.out.println(str1==str2); 4 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的
Angel_Kitty
2018/04/09
6000
【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中==与equals区别
而我们在实际开发中,自定义类:一般比较对象,都是通过对象的属性值进行比较,所以自定义类,会经常覆在自定义的类中写Object中的此方法,把自己的比较规则写在方法里面。
用户10358987
2024/04/23
920
Java 中的 ==, equals 与 hashCode 的区别与联系
这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。   而通过 new 来产生一个对象,并将这个对象和str1进行绑定:
heasy3
2020/08/03
1.6K0
== 和 equals 的区别详细解析与应用场景对比
我将从基本概念、比较规则、应用实例等方面,详细介绍==和equals的区别,并结合代码示例帮助你理解。
用户4124626
2025/06/12
1100
== 和 equals 的区别详细解析与应用场景对比
2.JAVA-基础语法以及String的介绍
目前java中,和C/C++有点区别,就是暂未用到goto const关键字.示例如下:
诺谦
2019/05/24
4000
Java中equals与==区别
(1)基本数据类型比较值:只要两个变量的值相等,即为true 注意:当基本数据类型使用“==”进行比较时,符号两边的数据必须类型兼容(类型相同或可自动类型转换),否则编译出错;
程序员飞飞
2020/02/27
7540
Java中equals与==区别
【IT领域新生必看】Java编程中的神奇对比:深入理解`equals`与`==`的区别
在Java编程中,比较对象是一个常见的操作。equals和==是两种常用的比较方式,但它们的工作原理和应用场景有所不同。对于初学者来说,理解equals与==的区别,是编写正确和高效代码的关键一步。本篇文章将详细介绍equals与==的定义、用法及其区别,帮助你全面理解这些重要概念。
E绵绵
2024/07/08
3930
Java基础(二)面试题
独立性的: 支持一次编写,到处运行的独立编程语言,即编译后的代码可以在支持 Java 的所有平台上运行。
宇宙无敌暴龙战士之心悦大王
2022/01/10
2900
Java基础(二)面试题
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
String是Java中的一个内置类,Immutable不可变,即一旦创建String对象,它的值就不能被更改。对String对象的replace、subString、toLowerCase等操作都会返回一个新String对象,故每次操作String时 性能较低、浪费内存空间
寻求出路的程序媛
2024/04/21
3770
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
Java常量池详解,秒懂各种对象相等操作
(2)节省运行时间:比较字符串时,== 比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。
Java识堂
2019/08/13
9270
JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
一、包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足, 在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。   1.1、包装类均位于Java.lang包,包装类和基本数据类型的对应关系如下表所示:   Primitive-Type     Wrapper-Class         byte         
用户1195962
2018/01/18
9470
JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
【Java面试题系列】:Java基础知识面试题,看这一篇就够了
参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后,一般都会让先做一份笔试题,然后公司会根据笔试题的回答结果,确定要不要继续此次面试,如果答的不好,有些公司可能会直接说“技术经理或者总监在忙,你先回去等通知吧”,有些公司可能会继续面试,了解下你的项目经验等情况。
用户5546570
2019/06/06
5130
Java中String类常见问题汇总
1.字符串常量和字符串对象比较 String str1 = "joshua317"; String str2 = new String("joshua317"); System.out.println(str1 == str2);//false System.out.println(str1.equals(str2));//true /** str1没有使用new关键字,在堆中没有开辟空间,其值"joshua317"在常量池中,str2使用new关键字创建了一个对象,在堆中开辟了空间,"=="比较的是对象
joshua317
2021/12/01
4470
Java中String类常见问题汇总
深入理解Java中的String
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
lyb-geek
2019/01/08
6650
Java知识面试题复习(四)Java常用API
形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置) 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志)
Maynor
2021/12/07
6440
Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换
float、double不能用来表示精确的值,运算不精确——>解决方案:BigDecimal。
寻求出路的程序媛
2024/02/27
12.1K0
Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换
【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型&运算符与类型分析
B站高清回放地址: 【https://www.bilibili.com/video/BV1Bm4y1Q7Wt?spm_id_from=333.999.0.0】 目录 一、Java环境搭建与使用(Ecl
红目香薰
2022/11/29
3360
【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型&运算符与类型分析
【面试专题】讲透必考点String,带配套视频
String 是我们实际开发中使用频率非常高的类,Java 可以通过 String 类来创建和操作字符串,使用频率越高的类,我们就越容易忽视它,因为见的多所以熟悉,因为熟悉所以认为它很简单,其实只是了解到皮毛,并没有真正掌握,而 String 又是面试的高频考点,所以我们有必要将 String 这个类深入研究,彻底搞定,本节课就为大家详细讲解 String 的核心机制以及实际使用。
南风
2019/09/09
3820
【面试专题】讲透必考点String,带配套视频
【J2SE快速进阶】——Java中的equals和==的区别
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/43313353
DannyHoo
2018/09/13
3510
【J2SE快速进阶】——Java中的equals和==的区别
深入理解Java关系运算符,避免常见错误!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/21
2760
深入理解Java关系运算符,避免常见错误!
推荐阅读
相关推荐
【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验