Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java中“==”和equals,究竟比的是什么

java中“==”和equals,究竟比的是什么

原创
作者头像
刘大猫
发布于 2024-12-08 13:22:30
发布于 2024-12-08 13:22:30
1120
举报
文章被收录于专栏:JAVA相关JAVA相关

@TOC

结论:

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。


具体说明:

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

代码语言:java
AI代码解释
复制
1 String str1 = new String("hello");
2 String str2 = new String("hello");
3         
4 System.out.println(str1==str2);
5 System.out.println(str1.equals(str2));

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

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

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

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

  这句话看似简单,理解起来还是需要细细体会的。说的简单点,==就是用来比较值是否相等。下面先看几个例子:

代码语言:java
AI代码解释
复制
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int n=3;
        int m=3;
        
        System.out.println(n==m);
        
        String str = new String("hello");
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        System.out.println(str1==str2);
        
        str1 = str;
        str2 = str;
        System.out.println(str1==str2);
    }

}

输出结果为 true false true

  n==m结果为true,这个很容易理解,变量n和变量m存储的值都为3,肯定是相等的。而为什么str1和str2两次比较的结果不同?要理解这个其实只需要理解基本数据类型变量和非基本数据类型变量的区别。

  在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).

  也就是说比如:

  int n=3;

  int m=3; 

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

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

  String str1;

  这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。

  而 通过new String("hello")来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:

  str1= new String("hello");

  那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串"hello"。这里面的引用和C/C++中的指针很类似。

  因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。

  而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

二.equals比较的又是什么?

  equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的实现。

  该类的源码路径为:C:\Program Files\Java\jdk1.6.0_14的src.zip 的java.lang路径下的Object.java(视个人jdk安装路径而定)。

  下面是Object类中equals方法的实现:

很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

  但是有些朋友又会有疑问了,为什么下面一段代码的输出结果是true?

代码语言:java
AI代码解释
复制
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        System.out.println(str1.equals(str2));
    }
}

要知道究竟,可以看一下String类的equals方法的具体实现,同样在该路径下,String.java为String类的实现。

  下面是String类中equals方法的具体实现:

可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

  其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。

代码语言:java
AI代码解释
复制
总结来说:

  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如StringDate等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java中==与equals区别
而我们在实际开发中,自定义类:一般比较对象,都是通过对象的属性值进行比较,所以自定义类,会经常覆在自定义的类中写Object中的此方法,把自己的比较规则写在方法里面。
用户10358987
2024/04/23
640
关于Java中==与equals的解析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/73497268
大黄大黄大黄
2018/09/14
4680
关于Java中==与equals的解析
Java中equals与==区别
(1)基本数据类型比较值:只要两个变量的值相等,即为true 注意:当基本数据类型使用“==”进行比较时,符号两边的数据必须类型兼容(类型相同或可自动类型转换),否则编译出错;
程序员飞飞
2020/02/27
7230
Java中equals与==区别
java判断字符串是否相等==的理解
我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题
西柚dzh
2022/06/09
1.4K0
【IT领域新生必看】Java编程中的神奇对比:深入理解`equals`与`==`的区别
在Java编程中,比较对象是一个常见的操作。equals和==是两种常用的比较方式,但它们的工作原理和应用场景有所不同。对于初学者来说,理解equals与==的区别,是编写正确和高效代码的关键一步。本篇文章将详细介绍equals与==的定义、用法及其区别,帮助你全面理解这些重要概念。
E绵绵
2024/07/08
3670
【Java面试题系列】:Java基础知识面试题,看这一篇就够了
参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后,一般都会让先做一份笔试题,然后公司会根据笔试题的回答结果,确定要不要继续此次面试,如果答的不好,有些公司可能会直接说“技术经理或者总监在忙,你先回去等通知吧”,有些公司可能会继续面试,了解下你的项目经验等情况。
用户5546570
2019/06/06
4930
JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
一、包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足, 在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。   1.1、包装类均位于Java.lang包,包装类和基本数据类型的对应关系如下表所示:   Primitive-Type     Wrapper-Class         byte         
用户1195962
2018/01/18
8960
JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
Java 中的 ==, equals 与 hashCode 的区别与联系
这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。   而通过 new 来产生一个对象,并将这个对象和str1进行绑定:
heasy3
2020/08/03
1.5K0
Java中 ==与equals的区别
==操作符在Java中用于比较两个对象的引用是否相等。具体来说,当使用==操作符时,它会比较两个对象的引用是否指向内存中的同一位置。如果两个引用指向同一对象,则==返回true;否则返回false。
人不走空
2024/02/20
1430
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
4180
Java中String类常见问题汇总
Java细节:单等于号、双等于号、三等于号(js中才有)的作用及双等于号和equals(源码)的区别
我们在编程时总是会用到=或==,但是等于号都有什么作用呢?下面我们来看一下 (注:下文会提及一点常量池、堆栈,由于本人了解还不是透彻,暂不做解释,日后会做总结,可先点击字面查看理解)
鲲志说
2025/04/07
770
【面试专题】讲透必考点String,带配套视频
String 是我们实际开发中使用频率非常高的类,Java 可以通过 String 类来创建和操作字符串,使用频率越高的类,我们就越容易忽视它,因为见的多所以熟悉,因为熟悉所以认为它很简单,其实只是了解到皮毛,并没有真正掌握,而 String 又是面试的高频考点,所以我们有必要将 String 这个类深入研究,彻底搞定,本节课就为大家详细讲解 String 的核心机制以及实际使用。
南风
2019/09/09
3660
【面试专题】讲透必考点String,带配套视频
Java知识面试题复习(四)Java常用API
形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置) 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志)
Maynor
2021/12/07
5950
#保姆级教学# Object 类结构的剖析(常用类)【附源码】
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
程序员迪迪
2022/01/06
2640
深入理解Java关系运算符,避免常见错误!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/21
2210
深入理解Java关系运算符,避免常见错误!
Java基础之String中equals,声明方式,等大总结
    转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 
bear_fish
2018/09/20
4130
Java基础之String中equals,声明方式,等大总结
深入理解Java中的String
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
lyb-geek
2019/01/08
6390
Java继承(下)
本博客不参与任何交易,也非中介,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。
Breeze.
2022/04/09
5580
Java继承(下)
Java常用类(二)String类详解
前言   在我们开发中经常会用到很多的常用的工具类,这里做一个总结。他们有很多的方法都是我们经常要用到的。所以我们一定要把它好好的掌握起来! 一、String简介 1.1、String(字符串常量)概述   在API中是这样描述:     String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。   java.lang.String:
用户1195962
2018/01/18
1.1K0
Java常用类(二)String类详解
Java 基础常见知识点&面试题总结(中),2022 最新版!
你好,我是 Guide。秋招即将到来,我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你。
Guide哥
2022/11/07
4230
Java 基础常见知识点&面试题总结(中),2022 最新版!
推荐阅读
相关推荐
Java中==与equals区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档