java中==和equals()的区别探究

news2024/9/21 10:54:25

目录

一、Object对象

二、==  

三、String类的equals()方法

四、示例

4.1直接定义两个相同的值比较

4.2直接定义两个值不同的字符串进行比较

4.3直接定义一个字符串和new一个字符串进行比较(两者值相同)

4.4直接定义一个字符串和new一个字符串进行比较(两者值不同)

五、小扩展 

六、总结:


🎈边走、边悟🎈迟早会好

== 和 equals 有什么区别?这个问题本身不难,但是被问到的频率很高,且大部分人的回答都不够全面,让人听了有种“恨铁不成钢”的感觉,所以今天咱们就来好好聊聊这个问题。

一、Object对象

对于 Object 来说,其 equals 方法底层实现就是“==”,如下 JDK 的 Object 源码如下:

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

也就是说,对于 Object 对象来说,equals 和 == 都是一样的,都是比较对象的引用是否相同

二、==  

  • 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
  • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

注:对于引用数据类型种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

三、String类的equals()方法

现在我们拿String类来举例:我们去\src\java\lang目录中找到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类中被重写的equals()方法其实是比较两个字符串的值是否相等。

  • 如果equals没有被重写,两种比较是相同的

  • 如果equals被重写了,那么两种比较自然不同

  • String内部默认重写了equals方法,所以:”==“ 比较引用,equals 比较值

下面我们通过实际代码来看看String类的比较。

四、示例

(”==“ 比较引用,equals 比较值)

4.1直接定义两个相同的值比较
String str1 = "tingyi";
String str2 = "tingyi";
System.out.println(str1 ==  str2); // true
System.out.println(str1.equals(str2)); // true

JDK1.7后:字符串常量池保存引用,常量池保存值 

在创建字符串的时候,会先创建一个字符串缓冲池,当创建str1时,先在字符串常量池中寻找有没有对应“hello”的对象,如果没有,就创建一个,然后将str1对象放入字符串常量池中,将str1的值“hello”放入常量池中。

当创建str2时,先在字符串常量池中找有没有对应“hello”的对象,发现str1对应的值和自己要创建的字符串值相同,就直接引用str1所引用的对象

  1. 两者引用的对象相同,都是“hello”,所以==为true
  2. 两者的值也相同,所以equals为true
4.2直接定义两个值不同的字符串进行比较
String str1 = "tingyi";
String str2 = "ting";
System.out.println(str1 ==  str2); // false
System.out.println(str1.equals(str2)); // false
  1. 两者所引用的对象不同(引用的地址也就不一样),所以 str1 == str2 肯定为false
  2. 两者的值也不同,所以下面的也是false
4.3直接定义一个字符串和new一个字符串进行比较(两者值相同)
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 ==  str2); // false
System.out.println(str1.equals(str2)); // true
  1. 因为str2 new了一个新对象,所以和str1的引用不是同一个,所以==的比较为false
  2. 但是两者的值是相同的,所以equals的比较为 true
4.4直接定义一个字符串和new一个字符串进行比较(两者值不同)
String str1 = "Hello";
String str2 = new String("Hi");
System.out.println(str1 ==  str2); // false
System.out.println(str1.equals(str2)); // false
  1. 因为str2 new了一个新对象,所以和str1的引用不是同一个,==的比较为false
  2. 两者的值是不相同的,所以equals的比较也为 false

五、小扩展 

 public class ObjectDemo{
     public static void main(String[] args) {
         String s1 = "Hello";
         String s2 = new String("Hello");
         s2 = s2.intern();
         System.out.println(s1 == s2);       //  true
         System.out.println(s1.equals(s2));  //  true
     }
 }

上述代码的第5行中,java.lang.String的intern()方法"Hello".intern()方法的返回值还是字符串"Hello",表面上看起来好像这个方法没什么用处。

但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"Hello"添加到字符串池中,然后再返回它的引用。

六、总结:

为了分析上面的代码,我们必须首先分析堆内存空间和栈内存空间,这一点非常重要: 

  • ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
  • equals():比较的是两个字符串的内容,属于内容比较。

🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好

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

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

相关文章

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码: 新建主图幅图类型指标都可以! VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

Vue3 项目中 svg 图标的封装及使用

安装 npm install vite-plugin-svg-icons -D在 vite.config.ts 中配置插件: import { createSvgIconsPlugin} from vite-plugin-svg-icons; import path from path;plugins: [createSvgIconsPlugin({iconDirs: [path.resolve(process.cwd(), src/assets/icons)],s…

解决win10报“无法加载文件……profile.ps1,因为在此系统上禁止运行脚本”的问题

打开命令行报错 解决方法 使用管理员权限打开PowerShell:WinX, 选择“Windows PowerShell(管理员)” 输入:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 输入:y确认修改安全策略 :y确认修改安全策略…

CAD、CAE、CAM介绍——定义,概述,历史,相关软件,应用与前景

目录 引出CAD/CAE/CAM计算机辅助设计 Computer-aided design (CAD)1.定义:2.概述3.类别4.科技5.软件: 计算机辅助工程 Computer-Aided Engineer (CAE)1.定义:2.概述3.CAE领域:4.应用与前景 计算机辅助制造 Computer-aided manufac…

Python自动化测试系列[v1.0.0][高效自动化设计]

Python多线程应用于自动化测试 将多线程在测试巧妙地应用,确实会带来很多好处,并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

百度网盘非会员,享受视频倍速

百度网盘会员过期了,看视频不能倍速很难受,下面就是跨过会员机制,享受倍速的方法。 Edge浏览器 在浏览器设置中找到扩展选项 在扩展中搜索视频速度控制 global speed,安装后即可使用

品牌推广必备:软文案例撰写与文案策划全解析!

做品牌推广, 不仅需要有推广渠道,文案的策划也是必不可少的一部分。文案是属于灵魂的部分。 作为一名手工酸奶品牌的创始人,目前全国也复制了100多家门店,这篇文章,详细和大家拆解,文案创作的要点&#xf…

金融科技赋能:加马智能质检系统引领金融机构迈向高效合规新时代

为了保护消费者合法权益、促进市场稳定健康发展,近年来监管机构相继发布了《银行保险机构消费者权益保护管理办法》、《银行业金融机构销售专区录音录像管理暂行规定》、《保险销售行为管理办法》等多项法律法规,对于银行、保险等金融机构的服务、销售行…

神卓互联共享文件使用教程

#文件共享# 文件共享已成为我们日常生活和工作中不可或缺的一部分。它如同一条无形的纽带,将人们紧密地联系在一起,促进了信息的快速传播和交流。 文件共享的魅力在于其打破了地域和时间的限制。无论我们身处世界的哪个角落,只要有网络连接&a…

我们所熟知的meme梗图也可以用AI生成了,老外都玩坏了。

meme梗图不知道大家看到过嘛?相信你们看见下面的图你就会大叫“卧槽”,原来是这种图,我以前经常狂刷不止,太有趣了。 其实meme是一个网络流行语,可译为模因。在大众非学术范围内也可翻译为我们所熟知的“梗”。其中“表…

4个方法帮助你解决RAR解压文件时提示密码错误问题

在日常工作和学习中,我们经常需要处理各种压缩文件,这些文件有时为了保护内容安全,会被设置密码。然而,在解压这些文件时,如果遇到“密码错误”的提示,可能会让人感到十分棘手。今天,我们就来探…

C++规范

一、VS工具集列表: Visual Studio 2008:v90 Visual Studio 2010:v100 Visual Studio 2012:v110 Visual Studio 2013:v120 Visual Studio 2015:v140 (v140_xp) Visual Studio 2017&a…

Java-Sql注入以及如何解决

sql脚本注入: 如果sql语句使用字符串拼接,可能会出现字符串的拼接,导致sql注入。 #是会先进行预编译,传进来的参数通过占位符填入到已经完成编译的语句中去。

windows 11 + kali wsl二合一配置步骤与踩坑

windows 11 kali wsl二合一配置步骤与踩坑 在前几天的某市攻防演练中,在攻防前期,我的虚拟机经常无缘无故出现断网、卡顿等现象,但找不出原因。 为了不影响后续的这些天的攻防演练,我选择在一个晚上通宵 在我的windows 11系统上…

鼠标录制工具|键鼠轨迹录制,实现自动办公

利用键鼠录制工具录制固定的鼠标点击、键盘输入等操作,实现自动化执行固定操作,节省时间。鼠标录制功能可以录制多步骤的操作,将录制的动作保存并命名,甚至可以编辑操作速度。下面将演示几种生活中常见的案例,详细讲解…

怎么才能选到好的猫咪主食冻干?公认顶尖优秀主食冻干总结

如今,主食冻干市场纷繁多样,质量水平却大相径庭。部分品牌盲目追求高营养值和利润增长,却忽略了猫咪健康饮食的本质需求,导致市场上充斥着以次充好、虚假标注日期等不法行为。更有甚者,部分产品未经权威第三方检测便匆…

E - Tree and Hamilton Path 2

算出所有路径之和2减去树的直径 #include <bits/stdc.h> using namespace std; typedef long long ll; const int N2e610; ll n,ans; ll e[N],h[N],idx,w[N],ne[N],dis[N]; void add(ll a,ll b,ll c){ e[idx]b,ne[idx]h[a],w[idx]c,h[a]idx; } ll c; void dfs(ll u,…

5款好用公司监控软件分享|管理者必看

当今社会&#xff0c;企业数据安全和员工工作效率成为了管理者不可忽视的重要议题。 选择合适的公司监控软件&#xff0c;不仅有助于提升管理效率&#xff0c;还能有效保障企业信息安全。 下面小编将为您分享五款备受好评的公司监控软件&#xff0c;助力管理者更好地管理企业…

前端使用Threejs加载机械臂并控制机械臂跳舞

1. 前言 在我的第一篇博客中,大致讲解了如何使用threejs导入机械臂模型,以及如何让机械臂模型动起来的案例,可以看一下之前的博客前端使用Threejs控制机械臂模型运动 本篇博客主要讲解的是在原来的基础上添加GSAP动画库的应用,可以通过动画,来让机械臂进行指定轨迹位姿的运动…

vue3 学习 之 vue3使用

为什么要学习vue3呢&#xff1f; vue2.0也是现在比较稳定的一个版本&#xff0c;社区还有周边都比较完善&#xff0c;如果不是非必要其实我们不需要着急直接升级到vue3.0; 那为什么还要学习&#xff0c;主要是还是为了了解一下vue3.0相较于2.0的优势和特性&#xff0c;方便之后…