90% 的人都会答错的面试题 == 和 equals 的区别

== 和 equals 的区别是什么?

== 解读

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

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

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

代码示例:

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。

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 方法,把引用比较改成了值比较。

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


往期精彩回顾

《Java 最常见的 200+ 面试题目》

《面试经验分享|精华版》

《程序员专属简历合集》

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

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

相关文章

【slowfast 训练自己的数据集】自定义动作,制作自己的数据集,使用预训练模型进行训练,并检测其结果

目录 前言一,视频的处理 1.1 视频准备1.2 切割视频为图片1.3 使用faster rcnn自动框人1.4 via标注图片二,数据集文件 2.1 数据集文件总览2.2 annotations 2.2.1 ava_train_v2.2.csv2.2.2 ava_val_v2.2.csv2.2.3 ava_val_excluded_timestamps_v2.2.csv2.…

windows Secure CRT使用SSH访问Linux服务器被拒绝,winscp访问Linux服务器被拒绝

我们在windows上使用Secure CRT、PUTTY等工具SSH连接到Linux服务器时,会出现linux服务器拒绝访问情况。 可能是Linux系统上没有安装SSH服务; 在终端输入: ssh localhost若出现: ssh: connect to host localhost port 22: Conne…

【代码收集】提前载入贴图

2019独角兽企业重金招聘Python工程师标准>>> 在进入一个比较大的场景的时候,我们一般都会提前load场景的贴图,使游戏更加流畅,一边加载一边显示游戏的加载的进度 具体的方法实现如下: CCTextureCache::sharedTextureCa…

Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件

Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件 背景 在主机上训练自己的Yolov5模型,转为TensorRT模型并部署到Jetson Nano上,用DeepStream运行。 硬件环境: RTX 2080TI主机 Jetson Nano 4…

Linux的tar、bzip2压缩解压命令

1.tar压缩 语法:tar 选项 压缩后的文件 目录 -c 打包 -z 打包同时压缩 -f 指定文件名 范例: tar -zcf test.tar.gz test2.tar解压 语法:tar 选项 解压的文件 -x 解包 -z 解压缩 -f 指定解压文件名 范例: tar -zxf test.tar.gz…

分析Linux文件rwx属性的含义

Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示 一般文件名外,连隐藏文件也会显示出来。 ls -l(这个参数是字母L的小写,不是数字1) 这个命令可以使用长格式显示文件内容,如…

程序员专属精美简历合集—第二弹

找工作除了技能之外最重要的就是简历,从某种意义上来说简历有时候比能力更重要!为什么简历如此重要?根据拉勾的招聘调研报告显示,大约有 80% 的简历通不过主筛。所以简历就是一堆 0 之前的那个 1,如果简历通不过筛选&a…

CDH6报错解决全记录

一、服务器准备 1、服务器配置 准备3台服务器,建议最低配置如下(阿里云大约每台每月六百多): centos7.4 8c 16G 39.101.192.109 node001 39.101.179.3 node002 39.99.236.205 node003 为服务器开启外网端口访问 7180、8900 2…

QT5动态创建多个按钮控件并关联信号槽函数

创建QT对话框工程,动态创建多个按钮,把动态创建的按钮存放在QList中,并关联同一个信号槽函数,在该槽函数中根据按钮对象名称各自进行其他事项处理。 在mainwindow.h文件添加 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include…

libcstl中的list没法插入自定义数据

一开始运行出错&#xff0c;开启debug以后发现在push自定义对象的时候调试器提示找不到一个叫/XXX/XXXX/XXXX/libcstl-2.3.0/src/cstl_list_private.c</br>而那个路径正是我进行安装的路径&#xff0c;安装完以后我把安装包给删除掉了&#xff0c;所以它找不到。这样的话…

Java 200+ 面试题补充 ThreadLocal 模块

让我们每天都有进步&#xff0c;老王带你打造最全的 Java 面试清单&#xff0c;认真把一件事做到极致。 本文是前文《Java 最常见的 200 面试题》的第一个补充模块。 1.ThreadLocal 是什么&#xff1f; ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程…

如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0

Apache Dolphin Scheduler 组件介绍 分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 官网 : https://dolphinscheduler.apache.org/en-us/ Github : https://github.com/apache…

Ubuntu20.04 pycharm python打包制作DEB包详细步骤及雷区

记录一次Deb打包过程及踩雷警示 最近写了一个python的小程序&#xff0c;希望能打包成deb文件&#xff0c;便于将写好的软件安装 在其他没有安装工作环境的电脑上&#xff0c;把这安装deb后可以在应用列表和桌面看到。下面介绍一个python工程的打包过程&#xff0c; 分为两大步…

有人问我,为什么1+1等于2

2019独角兽企业重金招聘Python工程师标准>>> 我回复说&#xff1a;“这是规则&#xff0c;天地万物有其规则&#xff0c;人观察而形成自己的规则。李小龙说&#xff1a;“以无法为有法&#xff0c;以无限为有限”&#xff0c;其实也是用最大的规则作为准则&#xff…

Python:通过SNMP协议获取华为交换机的ARP地址表

华为交换机SNMP配置 system-view 进入交换机的配置模式、[switch]snmp-agent community read huawei 配置community 只读属性为huawei[switch]snmp-agent community write huawei 配置community 可写属性为huawei[switch]snmp-agent sys-info version all 配置版本为所有# codi…

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

让我们每天都有进步&#xff0c;老王带你打造最全的 Java 面试清单&#xff0c;认真把一件事做到极致。 在 Java 中 和 equals 的区别&#xff0c;感觉只有很少的人能才完全说正确。 常见的错误回答就是&#xff1a; 基础类型对比的是值是否相同&#xff0c;引用类型对比的是…

Ray集群搭建 Python Demo

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

解决复杂多数据源报表的5种通用办法

很多报表工具只允许在报表中使用单个数据集&#xff0c;这类工具称为单源报表工具&#xff0c;常见的比如iReport&#xff0c;Birt&#xff0c;水晶报表&#xff0c;Style report等。很多情况下我们需要用单源报表工具展现多源数据&#xff0c;比如来自MysqlOracle的数据&#…

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

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

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

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