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

从零到一:OptimizePI Pre-layout PDN前仿真实战指南 本文详细介绍了如何使用OptimizePI进行电源完整性(PDN)前仿真,从软件安装配置到元器件建模、去耦电容配置及仿真参数设置,提供了实战技巧和常见问题排查指南。通过OptimizePI的Pre-layout仿真,工程师可以在PCB布局前优化电源分配网络,显著提升设计效率并降低成本。 阅读详情

摘要

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”添加到字符串池中,然后再返回它的引用。

Ubuntu 22.04 实战:为WIFI6网卡Realtek RTL8852BE手动编译驱动指南 本文详细介绍了在Ubuntu 22.04系统上为Realtek RTL8852BE WIFI6网卡手动编译驱动的完整指南。从问题诊断、环境准备到源码获取、编译安装,逐步解决驱动缺失问题,并提供常见问题排查和性能优化建议,帮助用户充分发挥WIFI6网卡性能。 阅读详情

相关推荐

利用WI生成无线信道数据

选取DeepMIMO的一个射线追踪场景O1(Outdoor 1)Scenario,工作频率为3.5GHz。有两条街和一个十字路口的户外场景18个基站和超过一百万个用户18个基站(BSs):BS1-BS18.每个基站的高度是8米每个基站的天线阵列是isotropic天线三个统一的x-y用户网格用户的总计数量为:1184923每个用户网格中的第一个用户总是(x,y)坐标最低的用户 所有用户的高度是2m每个用户的每个天线阵列是isotropic天线定义射频追踪场景。

bingbingaidaima的博客 5602

equals方法详解

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

qq_57887050的博客 3万+

ESP32实战:破解校园网WPA2-Enterprise认证的完整指南

本文详细介绍了如何使用ESP32开发板破解校园网WPA2-Enterprise认证的完整指南。通过硬件准备、环境搭建、核心代码实现及常见问题排查,帮助开发者解决企业级WiFi连接难题,特别适用于校园网环境下的物联网设备开发。

weixin_29194817的博客 454

equals ( ) 方法详解

equals详解 、equals与== 的区别

m0_59751050的博客 1万+

5分钟搞懂Paris公式:如何用裂纹扩展速率预测零件寿命(附Python代码示例)

本文详细介绍了Paris公式在裂纹扩展速率预测零件寿命中的应用,通过Python代码示例展示了从理论到实践的完整流程。文章涵盖了Paris公式的工程本质、寿命预测计算流程、几何修正因子选择以及实际案例演示,帮助工程师快速掌握这一关键技术。

weixin_29309475的博客 426

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1479

【Java】equals() 方法详解

equals方法详解

威威的博客 1万+

基于R-CNN深度学习的石头剪刀布手势识别系统:数据集、模型和UI界面的完整实现

本项目的目标是开发一个基于R-CNN深度学习模型的手势识别系统,能够识别石头、剪刀、布三种手势,并通过UI界面让用户能够进行交互。数据集准备与标注:收集包含石头剪刀布手势的图像,并对其进行标注。深度学习模型构建与训练:采用R-CNN模型进行手势的识别和定位。UI界面设计:设计一个简洁的界面,用户可以上传手势图像并进行识别。R-CNN(Region Convolutional Neural Networks)是一个典型的目标检测模型。生成候选区域。

YOLO 876

equals()方法详解

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

乔瑞的博客 2万+

2024年12月数据月报

2024年12月大数据月报,为您准备了阿里、字节、百度等大厂150多篇实践案例

SmartSi 2654

看懂特斯拉IMU底层逻辑,才懂农业机器人不可替代的核心技术壁垒

在自动驾驶与具身智能赛道,特斯拉彻底重构了IMU(惯性测量单元)的技术定位,打破行业“IMU仅为辅助补盲配件”的固有认知,将其从底盘附属硬件升级为纯视觉感知体系的物理核心基座。依托500–1000Hz超高刷新率、无外部依赖的惯性感知能力、端到端神经网络融合架构,特斯拉实现了“视觉感知环境、IMU定义运动”的技术闭环,摆脱对激光雷达、高精地图、卫星定位的强依赖。这套技术逻辑落地农业机器人赛道,不再是技术优化,而是规模化落地的生存刚需。城市自动驾驶属于结构化稳定场景,IMU仅作误差修正的锦上添花;

getusushu的博客 49

!"".equals(string)的用法

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

桃子的博客 6080

搭建 Newman + Postman + Git + Jenkins 环境教程

一步步搭建 Newman、Postman、Git 和 Jenkins 的环境。这些工具常用来做 API 测试和 CI/CD 自动化,尤其是 Postman 和 Newman 搭配 Git 和 Jenkins,能实现 API 集合的版本管理和自动测试。

Criss@陈磊 435

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

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

yuyonbbo的博客 1865

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

qq_45256805的博客 587

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

yifeng_liu的博客 251

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、付费专栏及课程。

余额充值