【Java扫盲篇】==和equals的区别

这是一道面试经典题,面试官对你说:小伙子,请你说说==equals的区别

==

对于==来说

  • 如果比较的是基本数据类型,那么==比较的是数据的值是否相同。注意:(与数据类型无关)
        int a = 10;int b = 10;System.out.println(a==b);//结果为trueint c = 10;float d = 10;System.out.println(c == d);//结果为true
  • 如果比较的是引用数据类型,那么==比较的是两个对象的地址是否相同,即两个引用是否指向同一块地址
        String s1 = "hello world";String s2 = "xiaoguo";System.out.println(s1 == s2); //结果为flaseString s3 = "tyut";String s4 = "tyut";System.out.println(s3 == s4);//结果为true
class Student{public int age;public String name;public  Student(int age,String name){this.age = age;this.name = name;}public static void main(String[] args) {Student student1 = new Student(18,"张三");Student student2 = new Student(18,"张三");System.out.println(student1 == student2);//结果为false}
}

明明student1 和 student2的内容相同,为什么结果却是false呢?

这是因为在堆中,会为每一个对象分配内存地址值,此时student1和student2指向不同的地址值,结果就为flase了
那你肯定有疑问,为什么s3和s4结果就为true呢?因为Java虚拟机中,字符串常量是共享的,在拥有“tuyt”的情况下,再创建s4时,就不需要再创建新的对象指向“tyut”,而是和s3一样,指向同一个地址值,所以结果为true

equals

如果类中重写了equals方法,其比较的是存放的内容是否相等
String、Date、File、包装类都重写了Object类的equals方法。

注意:
如果类中没有重写equals方法,比较地址值是否相等(是否指向同一个地址值)。

        String s1 = "hello xiaohua";String s2 = "hello xiaohua";System.out.println(s1.equals(s2));//结果为true

这是为什么呢?这是因为String重写了equals方法

public boolean equals(Object anObject) {if (this == anObject) {//这里的==是判断地址,如果地址相同那么肯定内容就相同//但内容相同,地址不一定相同哦,//因为完全有可能将多个内容相同的字符串存放到不能的位置return true;}if (anObject instanceof String) {//这里就是简单枯燥的一个字符一个字符比较//如果不是String类型,会被强转成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;}

再看下一个例子,请你给出判断结果

   public static void main(String[] args) {Student student1 = new Student(18,"张三");Student student2 = new Student(18,"张三");System.out.println(student1.equals(student2));}

结果为false,这又是为什么呢?
首先我们要复习一个知识,Java所有的类的父类都是Object类,自定义的Student类也是如此。
这时你是否恍然大悟,是时候该到Object的源码里查找equals方法了
在这里插入图片描述
此时我们找到Objec类,找到equals方法,可以看到equals方法底层是通过==来进行判断的。
那为什么String进行比较结果就是true呢?还记得前面提到过String、Date、File、包装类都重写了Object类的equals方法。
既然这样,当我们想要判断里面存放的内容相同时,就要重写equals方法了。

  public boolean equals(Object obj) {if (this == obj){return true;}if (obj instanceof Student){Student stu = (Student) obj;return this.age == stu.age && this.name.equals(stu.name);}return false;}

再次运行结果为true
那么每次都要手写吗?
当然不是,idea提供了快捷键,可以一键重写方法

    @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}

alt+insert (或者右键)然后选择equals()and hashsCode()
之后一路next就可以了

在这里插入图片描述

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!

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

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

相关文章

数据库系统概念(第二周 第二堂)(关系模型)

目录 回顾 关系模型 历史与现状 组成成分 数据结构——关系 关系定义 关系性质 关系和关系模式 难点概念理解 关系属性的分类 一、超码(superkey) 二、候选码(candidate key) 三、主码(primary key&#…

Catmull-Rom P5 ThreeJs与前端

文章目录 问题Echarts 3D如何让曲线变得平滑?Echarts 2D图中平滑效果是如何实现的?如何在一个Echarts 3D图中画一个圆圈?如何在Echarts 3D图中画一个立方体? Catmull-Rom插值算法先来回答第二个问题回到第一个问题在Echarts 3D图中…

C#关闭程序 CefSharp.BrowserSubprocess.exe,执行控制台命令

执行控制台命令,关闭大量的CefSharp.BrowserSubprocess进程, 控制台命令: taskkill /f /im CefSharp.BrowserSubprocess.exe 有权限要求: 需要设置执行程序为管理员模式,IIS部署的应用程序,设置应用程序池…

git基础命令(三)之远程命令

目录 基础概念origin git clonegit remote add 添加远程存储库git remote 显示远程存储库列表git pushgit pushgit push origin mastergit push origin --allgit push -f origin mastegit push origin --tags git fetch获取远程仓库的更新查看远程分支的更新情况拉取特定远程分…

【Linux】——进程地址空间 Linux2.6内核进程调度队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、环境变量的补充 二、进程空间的地址 2.1、程序地址空间 2.2、研究背景 2.3、程序地址空间 来段代码感受一下 2.4、进程地址空间 2.5、如何…

一文搞懂IP

IP 1. 基本介绍2. IP地址定义3. IP地址分类4. 子网掩码5. 全局地址与私有地址 1. 基本介绍 TCP/IP 协议的心脏是网络层,主要“实现节点之间的通信”,即“点对点(end-to-end)通信”。 网络层包含IP(Internet Protocol)及DNS(Domain Name Sys…

Linux的基本指令讲解

1 ls指令 语法: ls [选项][目录或文件] 功能: 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -d…

Leetcode 387. First Unique Character in a String

Problem Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1. Algorithm Use two lists: one list is used to count the letters in “s”; the other list is the position where the letter first …

Json Web Token(JWT) 快速入门

推荐视频:【从零开始掌握JWT】 目录 第一章 会话跟踪 01 使用Cookie和Session,jsessionid 02 使用token 例子一:自定义token 例子二:使用redis存储token 第一章 会话跟踪 应用背景 :浏览器访问web应用&#xff…

下拉树级带搜索功能

可以直接复制粘贴到自己的项目里,方法处把接口替换一下 <template><div><el-popoverplacement"bottom"width"200"trigger"click"><el-inputslot"reference"class"mrInput":placeholder"placehol…

天锐绿盾 | 公司内部文件数据 \ 资料加密系统,数据防泄密软件

#防止设计图纸、各种类型文件、各种类型软件、财务数据、客户资料、源代码&#xff0c;数据存储服务器、SVN、Git等商业核心文件数据外泄# 天锐绿盾是一款专业的企业级文件数据及资料加密系统&#xff0c;旨在为企业内部数据安全提供强有力的支持。 德人合科技 | ——天锐绿盾…

生成式人工智能如何改变商业和社会

生成式人工智能是否将带来生产力黄金时代,或在全球经济中摧毁数以百万计的生计?它是否将带人们步入个人充实的新成长道路,或引导他们一步步走入孤独和隔离的死胡同?它是否将 引领人类 走向新的高处,或播下我们集体毁灭的种子? 自ChatGPT上线以来14个月来,人们还没有完全弄清…

B站python爬虫课程笔记(Q11-15)

下面是学习的网址&#xff1a; ​​​​​​【Python爬虫】 目录 11、class定义类别的一些问题 1&#xff09;定义init初始化函数的一些问题 2&#xff09;定义两个不同函数之间要有空行 3&#xff09;print的技巧 12、class定义类别的一些问题2 13、class_inheritance类…

MySQL数据库的基本概念与安装

目录 引言 一、数据库的基本概念 &#xff08;一&#xff09;数据、表与数据库 1.数据(Data) 2.表 3.数据库 &#xff08;二&#xff09;数据库管理系统 &#xff08;三&#xff09;数据库系统 二、数据库的发展 三、主流数据库的介绍 &#xff08;一&#xff09;关…

地理数据表达方式学习——KML与SHP

一、KML-Keyhole Markup Language Keyhole Markup Language (KML)是一种XML符号&#xff0c;用于浏览器中二维地图和三维地球的地理注释和地理可视化&#xff08;地理数据包括点、线、面、多边形、多面体以及模型等&#xff09;。KML是伴随着Google Earth的使用而开发的&#x…

word的第六课笔记

1.排版的六大特点&#xff08;留白、对齐、亲密、对比、重复、可自动更新&#xff09; 先设置页边距为2厘米&#xff0c;左侧装订线考虑2.75厘米。段落间距段前段后设置一个就可以了&#xff0c;如段前0.5行 &#xff08;留白&#xff1a;让文字更加容易阅读&#xff0c;调大页…

AMRT 3D 数字孪生引擎(轻量化图形引擎、GIS/BIM/3D融合引擎):智慧城市、智慧工厂、智慧建筑、智慧校园。。。

AMRT3D 一、概述 1、提供强大完整的工具链 AMRT3D包含开发引擎、资源管理、场景编辑、UI搭建、项目预览和发布等项目开发所需的全套功能&#xff0c;并整合了动画路径、精准测量、动态天气、视角切换和动画特效等工具。 2、轻量化技术应用与个性化定制 AMRT3D适用于快速开…

体验函数式组件简单实现Loading 加载(造轮子篇)

一、前言 最近想着优化一下网站&#xff0c;在文章列表页加一个Loading操作&#xff0c;于是就想到了函数式组件&#xff0c;于是本章就来和大家一起简单探讨下实现思路。 二、Loading设计 这里我想实现的效果是&#xff1a;当我们刷新页面的时候&#xff0c;前端请求接口&…

【MySQL】中位数巧解之给定数字的频率查询中位数

力扣题 1、题目地址 571. 给定数字的频率查询中位数 2、模拟表 Numbers 表&#xff1a; Column NameTypenumintfrequencyint num 是这张表的主键(具有唯一值的列)。这张表的每一行表示某个数字在该数据库中的出现频率。 3、要求 中位数 是将数据样本中半数较高值和半数…

扭矩测量仪行业研究:规模不断扩大市场需求旺盛

一、市场趋势 扭矩测量仪是用于精确测量旋转力矩的精密仪器&#xff0c;广泛应用于汽车、航空航天、机械制造和电子产品等领域。随着工业自动化程度的提升和精密制造的需求增加&#xff0c;扭矩测量仪的市场呈现出稳步增长的趋势。 二、主要竞争者 市场上的主要竞争企业包括德国…