java中 equals()方法 与 “==”的区别

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写 本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。 阅读详情

摘要

java语言的 equals() 方法 与 “==” 的区别,是每个初学者都会遇到过的问题。之前自己也很清楚,可日子一长,又渐渐遗忘,于是整理出一篇博客,复习一下。

1. 基本数据类型

java的基本数据类型,也称为原始的数据类型。它们分别是:
byte, short, char, int, long, float, double, boolean .
基本数据类型进行 “==” 比较时,比较的是 它们的值 是否相同。
例如:

int a = 10;
int b = 10
System.out.println(" (a == b) = " + (a == b));

输出的结果为真。
另外需要注意的是,对于基本类型而言,它们没有 equals() 方法,大家别上当啊。

2. 复合数据类型(类)

1) 当 两个对象使用 “==” 进行比较时,比较的是它们在 内存中存放的地址。 也就是说,除非是 同一个new() 出来的两个对象(内存地址相同), 否则比较的结果都是false。具体测试代码如下:

public class Main {
    public static void main(String args[]) {
        Worker worker1 = new Worker();
        //worker2 是 worker1 的引用,同指向一个内存空间。
        Worker worker2 = worker1;
        System.out.println("(worker1 == worker2) : " + (worker1 == worker2));

        System.out.println("-------------------------");

        Worker worker3 = new Worker();
        //worker3 与 worker4 都是调用new 产生的对象,不指向同一个内存空间。
        Worker worker4 = new Worker();
        System.out.println("(worker3 == worker4) : " + (worker3 == worker4));
    }
}

class Worker {

    private String name;
    private double salary;

    public Worker() {
        this.name = "echo";
        this.salary = 0.0;
    }
    public Worker(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

输出的结果:
(worker1 == worker2) : true
-------------------------
(worker3 == worker4) : false

2) 大家都知道java的所有类 都是从 java.lang.Object 这个类继承下来,而Object 类中原本就有一个 equals() 方法。首先,我们来看看源代码中 Object 类的equals() 方法。具体代码如下:

public boolean equals(Object obj) {
    return (this == obj);
}

可以发现,默认情况下,当我们调用equals() 方法时,也仍然是比较两个对象 是否指向同一块内存空间。 我们 稍微 修改 上面的代码,进行测试。具体代码如下:

public class Main1 {
    public static void main(String args[]) {
        Worker worker1 = new Worker();
        //worker2 是 worker1的引用,同指向一个内存空间。
        Worker worker2 = worker1;
        System.out.println("worker1.equals(worker2) : " + worker1.equals(worker2));

        System.out.println("-------------------------");

        Worker worker3 = new Worker();
        //worker3 与 worker4 都是调用new 产生的对象,不指向同一个内存空间。
        Worker worker4 = new Worker();
        System.out.println("worker3.equals(worker4) : " + worker3.equals(worker4));
    }
}

class Worker {
    private String name;
    private double salary;

    public Worker() {
        this.name = "echo";
        this.salary = 0.0;
    }
    public Worker(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

运行结果如下:
worker1.equals(worker2) : true
-------------------------
worker3.equals(worker4) : false

这个时候,大家一定有疑问了,不是都说,equals() 方法比较的是 两个对象的内容嘛? 没错,默认的约定是这样的。对于我们自己写的类,如果想要达到这个效果,那么就要重写 equals()方法了。具体代码如下:
(可以直接使用 eclipse的工具,选择自己想要进行比较的变量,自动生成 equals()方法)。

class Worker {
    private String name;
    private double salary;

    public Worker() {
        this.name = "echo";
        this.salary = 0.0;
    }
    public Worker(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }

    //重写了Object类的 equals() 方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Worker other = (Worker) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (Double.doubleToLongBits(salary) != Double
                .doubleToLongBits(other.salary))
            return false;
        return true;
    }
}

接下来,看一下测试类,以及运行结果:

public class Main1 {
    public static void main(String args[]) {
        Worker worker1 = new Worker();
        //worker2 是 worker1的引用,同指向一个内存空间。
        Worker worker2 = worker1;
        System.out.println("worker1.equals(worker2) : " + worker1.equals(worker2));

        System.out.println("-------------------------");

        Worker worker3 = new Worker();
        //worker3 与 worker4 都是调用new 产生的对象,不指向同一个内存空间。
        Worker worker4 = new Worker();
        System.out.println("worker3.equals(worker4) : " + worker3.equals(worker4));
    }
}

运行结果如下:
worker1.equals(worker2) : true
-------------------------
worker3.equals(worker4) : true

3) 在jdk的源代码中,大部分的类都自己实现了 equals() 方法,例如我们熟悉的 String,Integer,Double,Long等。大家在使用jdk提供的类时,使用到 equals()方法,最好查看一下源码,保证不出错。

3. 怪异的String

上文说了,String类重写了 equals() 方法,当调用equals()方法比较两个String对象时,比较的是其内容,那 怪异二字 从何而来呢? 且看下面代码:

public class Main2 {
    public static void main(String args[]) {
        String s1 = "hello world";
        String s2 = "hello world";

        System.out.println("s1.equals(s2) : " + s1.equals(s2));
        System.out.println("(s1 == s2) : " + (s1 == s2));

    }
}

运行结果如下:
s1.equals(s2) : true
(s1 == s2) : true
输出结果说明,s1 与 s2 同指向一个 String对象。

先不着急,我们再修改一下上面代码:

public class Main3 {
    public static void main(String args[]) {

        String s1 = "hello world";
        String s2 = new String("hello world");

        System.out.println("s1.equals(s2) : " + s1.equals(s2));
        System.out.println("(s1 == s2) : " + (s1 == s2));

    }
}

运行结果:
s1.equals(s2) : true
(s1 == s2) : false
输出结果说明,s1 与 s2 不属于同一个String对象。

为什么出现上面这个怪异的问题?
原来,程序在运行的时候会创建一个字符串缓冲池。
当使用 String s2 = “hello world” ,
这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1,将s2引用 s1所引用的 对象 “hello world”。
第二段程序中,使用了 new 操作符,它明白的告诉程序:”我要一个新的!不要旧的!”于是一个新的”hello world” Sting对象被创建在内存中。它们的值相同,但是内存地址不同,一个在池中游泳,另一个在岸边休息。

事情还没完,在看看下面这个例子。

public class Main4 {
    public static void main(String[] args) {
        String s1 = "hello world";
        String s2 = new String("hello world");

        s2 = s2.intern();

        System.out.println("s1.equals(s2) : " + s1.equals(s2));
        System.out.println("(s1 == s2) : " + (s1 == s2));
    }
}

运行结果如下:
s1.equals(s2) : true
(s1 == s2) : true

怎么会这样???
原来,java.lang.String的intern()方法 ,例如 “abc”.intern()方法的返回值还是字符串”abc”,表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在”abc”这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把”abc”添加到字符串池中,然后再返回它的引用。

BMS硬件设计要点:从STM32主控到BQ76920监控芯片的工程实践 电池管理系统(BMS)是锂电安全与寿命保障的核心,其硬件设计涉及微控制器选型、专用监控芯片接口、电源完整性、信号完整性及PCB布局等多维度协同。基于STM32与BQ76920的典型双层架构,需深入理解功能安全解耦原理——关键保护由ASIC硬件实现,算法决策交由MCU完成,契合ASIL-B等级要求。技术价值体现在毫秒级硬件保护响应、±10mV电压采样精度及抗EMI鲁棒性设计;广泛应用于电动工具、储能系统与轻型电动车等中高功率场景。本文聚焦BMS控制板硬件实现中的高频时钟EMC、I²C总线信号完整性、被动均衡可 阅读详情

相关推荐

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置指南配置JAVA配置mooctest配置ChromeDriver配置SeleniumSelenium的使用 环境配置指南 配置JAVA 首先进入JDK8官方安装地址 然后找到Windows 64位 jdk8 点击下载(这里下载需要登录Orcale 账户) 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 D:\java\jav

Kennen0_0的博客 9606

equals方法详解

一、equale方法是什么? Object 类中的 equals 方法是用于检测一个对象是否等于另外一个对象。在Object类中实现的 equals 方法将确定两个对象是否具有相同的引用(内存地址)。如果两个对象具有相同的引用,那么他们一定是相等的,看看下面这段代码的运行: public static void main(String[] args) { Object o = new Object(); //分别将 o 赋值给变量o1,o2 Object o1 ...

qq_57887050的博客 3万+

#智慧文旅#文创商城管理系统,一站式文旅商品营销管理平台

#智慧文旅#文创商城管理系统满足景区、运营公司或者全域文旅对文创店铺、商品的全流程管理需求,提供文创商品的线上线下产品销售、会员管理、促销管理等服务。包括文创店铺的基本信息管理、文创商品的分类管理、标签管理、上下架管理、库存案例、配送管理等功能。

数字赋能,开启智慧文旅新时代 1172

equals ( ) 方法详解

equals详解 、equals与== 的区别

m0_59751050的博客 1万+

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

[漏洞剖析]JeecgBoot queryFieldBySql注入与JDBC连接滥用:从内存马植入到RCE的完整攻击链

本文深度剖析了JeecgBoot框架中queryFieldBySql接口的SQL注入漏洞及其引发的完整攻击链。攻击者利用该漏洞,通过Freemarker SSTI植入隐蔽的内存马,并进一步滥用JDBC连接测试功能,借助H2数据库特性实现远程命令执行(RCE),揭示了低代码平台中功能滥用与安全配置疏忽带来的严重风险。

weixin_29232121的博客 115

【Java】equals() 方法详解

equals方法详解

威威的博客 1万+

Superpowers与 OpenSpec、Spec Kit 对比

按照官方仓库定义,Superpowers 是一套构建在 composable skills 之上的完整软件开发工作流。它不是单纯的 prompt 集合,而是把一系列工程动作做成默认流程。一个需要明确的点:Superpowers 并不只偏 Claude Code,根据。

人不风流枉少年 1813

equals()方法详解

一、equals方法作用: equals()方法是用来判断其他的对象是否和该对象相等 二、equals()方法在object类中定义: public boolean equals(Object obj) { return (this == obj); } 上边我们很明显看出是比较2个对象引用地址是否相同,但是我们平时在调用String、Integer等封装类型时的eq...

乔瑞的博客 2万+

从服务器到桌面超算:当3999美元的NVIDIA DGX Spark装上Ubuntu,普通开发者能玩出什么花?

DGX Spark的出现,标志着AI算力正在经历从"数据中心集中供给"到"个人桌面按需拥有"的范式转移。它让开发者可以在本地完成从数据预处理、模型微调到推理验证的全流程,只有在需要大规模训练时才调用云端资源。迭代速度:从按小时计费的云端调试,变成随时随地的本地实验数据主权:敏感信息永不离开本地成本可控:一次投入,长期使用,不受API调用次数限制AI算力民主化的时代,真的来了。你的下一台超级计算机,不必在云端。它就在你的桌面上,安静地等待着你的下一个创意。附录:实用资源。

QQ_778132974的博客 615

SAP:QUERY中SQ02增加选择屏幕权限控制

【代码】SAP:QUERY中SQ02增加选择屏幕权限控制。

weixin_43734184的博客 2325

!"".equals(string)的用法

String str; 1:"".equals(str) 是判断str是否是空串,如果是空串,则返回true,否则为false; 2:!"".equals(str) 判断变量str是否是空串,如果不是空串,返回true,否则为false; 3: 常量.equals(变量) 与 变量.equals(常量)的区别 两种都是校验变量的值是否符合预期。 但是 变量.equals(常量) 的用法,可能会...

桃子的博客 6080

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

Java中equals()方法和双等号“==”的区别

Java中equals()方法和双等号“==”的区别 1.双等号== ,如果比较的是基本数据类型的变量,比较的是其赋值的内容是否相等,如果比较的是引用类型的变量,则比较的是所指向的对象的地址是否相等。 2.equals()方法 ,equals方法不能用来比较基本数据类型的变量。默认情况下equals()比较的也是对象的地址是否相等。但很多引用类型都对equals()方法进行了重写,使其比较的是对象...

yuyonbbo的博客 1865

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

“==”算数运算符与equals()方法的区别 java

1.“==”算数运算符 1.首先==是算数运算符

qq_45256805的博客 587

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java中equals()方法和“==”的区别

一、基本数据类型 二、引用数据类型 包装器类型 三、样例分析 一、基本数据类型   Java中的八种基本数据类型,没有对应的equals()方法,所以在此不做分析。对于“==”,基本数据类型比较的是值 注意:   其实无论是基本数据类型还是引用数据类型,在进行“==”比较时,都可以理解为比较的是值 。只不过对于基本数据类型来说,变量存储的是值,而引用数据类型存的是指向堆中对象的...

yifeng_liu的博客 251

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java中的equals()方法以及与"=="的区别

一、问题描述: Java中,关于比较两个字符串是否相等的问题,经常会出现。今天在用Java实现需求的时候,发现equals()和“==”的功能有点分不清,导致结果产生巨大的偏差。所以,我决定花点时间把equals()和“==”的功能彻底给弄懂。 二、分析探索解决问题的方法: 1、Object 中的equals()方法: (1)通过查找API,说明如下: equals public bo...

weixin_44255799的博客 1738

Java中"=="与equals()方法的区别

1.  操作符”==”用来比较两个操作元是否相等,这两个操作元既可以是基本类型,也可以是引用类型。例如:int a1=1,a2=3;      boolean b1=a1==a2; //”==”的操作元为基本类型,b1值为false      String str1=”Hello”,str2=”World”;      boolean b2=str1==str2; //”==”的操

1683

彻底弄懂Java中的equals()方法以及与"=="的区别

一、问题描述: 今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差。所以,我决定花费时间把equals()和“==”的功能彻底弄懂,前事不忘后事之师嘛,分享给大家,希望对大家理解equals()和“==”的功能有所帮助。 二、分析探索解决问题的方法: 1、Object 中的equals()方法: (1)通过查找API,说明如下:

G_66_hero的博客 2万+

Java中“==”与equals()方法的区别

Java中==与equals()的区别 一、基本概念区分 1、对于==,比较的是值是否相等 对于基本数据类型,比较的是存储的值是否相等 对于引用数据类型,比较的是所指向的对象的地址是否相同 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('igno

zh_java_4869的博客 214

Java中.equals()方法和“==”的区别

equals()和==是什么? equals():是方法,定义在超类Object中的一个方法,而Java中所有的对象都是继承自Object类的,所以子类是可以重写eqauls()方法而实现不同的功能。 ==: 是操作符,用来比较两个对象。 为什么会将一个操作符和一个方法进行比较呢? 因为它们都是用来比较两个对象的,但它们在用法上又有些区别。 Java中e...

李公子的博客 527

Java中 equals() 方法与“==”区别

1.“==” “==”比较的是值是否相等(对于基本数据类型而言,比较的就是存放数据的大小;对于引用类型而言,比较的是存放的地址是否相等) /* == */ class Person { private String name; private int age; public Person(String name, int age) { this.age ...

学习笔记。 168

java对象“==”与equals()方法的区别

private Deque<Integer> data; private Deque<Integer> helper; ... if(helper.peek()==data.peek()){ ... } 在一次编程中发现两个栈的栈顶元素打印是相等的,但是却进入不了if语句。后来发现是因为java中自动装箱自动拆箱在基本类型int和对象类型Integer之间转换,在hel...

weijifen000的博客 255

Java中equals()方法与"=="的区别

概述Java中equals()方法和”==”的用法在求职中经常遇到,学习之后时间长了容易忘记,所以整理一下学习笔记以便日后复习。若有不对,欢迎指正,大家相互学习。使用“==”时,当时基本数据类型比较时,比较它们存储的值是否相等。当比较引用类型时,比较引用变量所指向的对象地址是否相等。 使用equals() 方法时,但equals方法不能作用于基本数据类型。

struggledhard的博客 366

Java中关系操作符“==”和equals()方法的区别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33881753的博客 138
上一篇: java泛型
下一篇: logback-classis日志打印注意事项
sillyzql
博客等级 码龄14年 13粉丝 3原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值