你真的知道 == 和 equals 的区别吗?

让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致。

在 Java 中 == 和 equals 的区别,感觉只有很少的人能才完全说正确。

常见的错误回答就是:== 基础类型对比的是值是否相同,引用类型对比的是引用是否相同;而 equals 则是比较的值是否相同。

至于为什么说它是错的,看完本文对 == 和 equals 的解读,你就知道了。

1、== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

代码示例:

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

2、equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat {public Cat(String name) {this.name = name;}private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

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

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;
}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

3、总结

总体来说,== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

扫描下方二维码,关注更多动态:

系列文章推荐:

Java 最常见的 200+ 面试题

程序员精美简历Top榜—面试必备

你真的懂 == 和 equals 的区别吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ray集群搭建 Python Demo

目录 准备条件(基于linux环境) 参考文献例子-python Ray集群 1.部署head节点2.部署worker节点部署Ray集群安装Ray(在所有节点上安装)Ray工作原理Ray的优势Ray简介准备条件(基于linux环境) 这里部署2个节点…

Java 200+ 面试题补充② Netty 模块

让我们每天都能看到自己的进步。老王带你打造最全的 Java 面试清单,认真把一件事做到最好。 本文是前文《Java 最常见的 200 面试题》的第二个补充模块,第一模块为:《Java 200 面试题补充 ThreadLocal 模块》。 1.Netty 是什么? …

Ray.tune可视化调整超参数Tensorflow 2.0

Ray.tune官方文档 调整超参数通常是机器学习工作流程中最昂贵的部分。 Tune专为解决此问题而设计,展示了针对此痛点的有效且可扩展的解决方案。 请注意,此示例取决于Tensorflow 2.0。 Code: ray/python/ray/tune at master ray-project/ray GitHub E…

MySql 优化的 30 条建议

文章来源&#xff1a;包子博客MySql 优化的 30 条建议1、应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引…

Ubuntu18 Win10搭建Caffe训练识别mnist手写数字demo

ubuntu 系统下的Caffe环境搭建 对于caffe的系统一般使用linux系统&#xff0c;当然也有windows版本的caffe&#xff0c;不过如果你一开始使用了windows下面的caffe&#xff0c;后面学习的过程中&#xff0c;会经常遇到各种错误&#xff0c;网上下载的一些源码、模型也往往不能…

windows server 2008 IE代理服务器实验

一、首先介绍IE代理服务器的好处如下&#xff1a;1、节省带宽 2、绕过防火墙二、下面以这个软件为代理软件&#xff0c;本人在物理机和虚拟机实验&#xff0c;1、首先在物理机安装代理软件&#xff0c;安装完成如图所示&#xff1a;2、在“设置”项代理协议端口、在本地局域网…

Java 200+ 面试题补充③ Dubbo 模块

昨天在我的 Java 面试粉丝群里&#xff0c;有一个只有一年开发经验的小伙伴只用了三天时间&#xff0c;就找到了一个年薪 20 万的工作&#xff0c;真是替他感到开心。 他的经历告诉我们&#xff1a;除了加强自我实战经验之外&#xff0c;还要努力积累自己的理论知识。 人生没有…

十一、PyQt5点击主窗口弹出另一个非模态子窗口

单击主对话框菜单“设置“下的”交换机配置”action的信号与槽 主对话框代码: # -*- coding: utf-8 -*-import sys from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QDesktopWidget import win32api import win32con

彻底搞懂 Java 中的注解 Annotation

Java注解是一系列元数据&#xff0c;它提供数据用来解释程序代码&#xff0c;但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。网络上对注解的解释过于严肃、刻板&#xff0c;这并不是我喜欢的风格。尽管这样的解释听起来非常的专业。为了缓解大…

cs时间校准

2019独角兽企业重金招聘Python工程师标准>>> c/s结构中的时间校准 拜读了风云的一篇博客 思路比较明显简单: C发包打时间戳 S收包打时间戳 S回应包打时间戳 C收包打时间戳 4个时间戳可以进行计算校准. 假设来回时间相等 转载于:https://my.oschina.net/u/1449566/bl…

使用ACME部署生成阿里云免费HTTPS证书

使用ACME部署HTTPS证书 背景 现在越来越多的服务都是基于web&#xff0c;大多数默认使用HTTP协议。HTTP协议是一种没有加密的协议&#xff0c;所有数据都通过明文传输&#xff0c;即便是只在内网使用也存在一定的安全风险。尤其是对于登录等操作&#xff0c;账号密码通过HTTP…

Java性能优化的50个细节(珍藏版)

来源&#xff1a;http://t.cn/EMze6kc在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担&#xff0c;缩短加载…

强化学习基础篇 OpenAI Gym 环境搭建demo

1. Gym介绍 Gym是一个研究和开发强化学习相关算法的仿真平台&#xff0c;无需智能体先验知识&#xff0c;由以下两部分组成 Gym开源库&#xff1a;测试问题的集合。当你测试强化学习的时候&#xff0c;测试问题就是环境&#xff0c;比如机器人玩游戏&#xff0c;环境的集合就…

九、PyQt5 QLineEdit输入的子网字符串校验QRegExp

自己编写的用于对lineEdit编辑框输入的子网,例如:192.168.60.1/24字符串校验是否合规。 # 限制lineEdit编辑框只能输入./字符和数字reg = QRegExp([0-9./]+$)validator = QRegExpValidator(self)validator.setRegExp(reg)self.lineEditSubNet.setValidator(validator)

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接

本文&#xff0c;也是对于Java中字符串相关知识的一个补充&#xff0c;主要来介绍一下字符串拼接相关的知识。本文基于jdk1.8.0_181。字符串拼接字符串拼接是我们在Java代码中比较经常要做的事情&#xff0c;就是把多个字符串拼接到一起。我们都知道&#xff0c;String是Java中…

Google强化学习框架SEED RL环境部署

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 本框架是Google发布于ICLR2020顶会上&#xff0c;这两天发布于Google Blog上 **论文Arxiv&#xff1a;**https://arxiv.org/abs/1910.06591 ||…

PLSQL连接oracel数据库_用户无法登陆_oci.dll_配置问题

为什么80%的码农都做不了架构师&#xff1f;>>> 由于工作需要换了台新电脑&#xff0c;在抚摸新笔记本满怀新鲜感和喜悦心情之余&#xff08;其实纯屌丝味尽显无余&#xff0c;就基本和双手捧托一颗高大上的茶叶蛋般内心激动且泪眼汪汪&#xff09;&#xff0c;重新…

CentOS7搭建部署Ambari 2.6.2.0最新版(HDP-UTILS、HDP-GPL)大数据平台

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 注&#xff1a;本文基于root用户操作 一、安装环境准备 操作系统 centos7.5 hdc-data1&#xff1a;192.168.163.51 hdc-data2&#xff1a;192.16…

阿里面试题BIO和NIO数量问题附答案和代码

一、问题 BIO 和 NIO 作为 Server 端&#xff0c;当建立了 10 个连接时&#xff0c;分别产生多少个线程&#xff1f; 答案&#xff1a; 因为传统的 IO 也就是 BIO 是同步线程堵塞的&#xff0c;所以每个连接都要分配一个专用线程来处理请求&#xff0c;这样 10 个连接就会创建…

CentOS7搭建离线部署Cloudera CDH 6.2.0大数据平台

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 1.概述 CDH&#xff0c;全称Clouderas Distribution, including Apache Hadoop。是Hadoop众多分支中对应中的一种&#xff0c;由Cloudera维护&a…