java:String使用equals和==比较的区别

2023-10-26

 "=="操作符的作用

1、用于基本数据类型的比较

2、判断引用是否指向堆内存的同一块地址。

equals所在位置:

在Object类当中,而Object是所有类的父类,包含在jdk里面,但并不适合绝大多数场景,通常需要重写

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

equals的作用:

用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型

equals的基本使用:

boolean b = obj1.equals(obj2);

String类型比较不同对象内容是否相同,应该用equals,因为==用于比较引用类型和比较基本数据类型时具有不同的功能。

分析如下:

String作为一个对象来使用

例子一:对象不同,内容相同,"=="返回false,equals返回true

String s1 = new String("java");
String s2 = new String("java");

System.out.println(s1==s2);            //false
System.out.println(s1.equals(s2));    //true

例子二:同一对象,"=="和equals结果相同

String s1 = new String("java");
String s2 = s1;

System.out.println(s1==s2);            //true
System.out.println(s1.equals(s2));    //true

String作为一个基本类型来使用

如果值不相同,对象就不相同,所以"==" 和equals结果一样

String s1 = "java";
String s2 = "java";

System.out.println(s1==s2);            //true
System.out.println(s1.equals(s2));    //true

如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。

如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。

 

 

分析前基础了解:

一)JVM把内存划分成两种:一种是栈内存,一种是堆内存。

  ①在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配。

  ②当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

  ③堆内存用来存放由new创建的对象(包括由基本类型包装起来的类:Integer、String、Double,实际上每个基本类型都有他的包装类)和数组。

二)Object类中的equals方法:
public boolean equals(Object obj) {
return (this == obj);
} // 可以看出Object类中equals方法是用==判断对象引用是否指向同一内存地址。

三)String类很特殊 ,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方法不仅可以用==判断对象的内存地址是否相等,相等则返回true。如果前面的判断不成立,接着判断括号内的对象上是否是String类型,接着判断两个字符串对象的的长度是否相等,最后判断内容是否相等,如果相等则返回true。

四)开始具体分析:

4.1 在基本数据类型中的比较
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); //true
//num1 和num2都是int型 它们的值都是10,因此使用”==”当然相等.

4.2 在引用数据类型中的比较
⑴String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // true
System.out.println(s1.equals(s2)); // true

当执行String s1 = “hello”;这条语句时,会在堆中的字符常量池里找”hello”这个字符串,若没有找到,则将”hello”这个字符串放入字符串常量池中.而在栈中开辟一块名为s1的空间存放”hello”,这块空间的引用.当执行String s2 = “hello”;这条语句时,会在堆中的字符串常量池里找”hello”这个字符串,很显然,可以找到,于是便把字符常量池里”hello”这个字符串的引用地址赋给s2,因此s1与s2存放的都是堆中字符常量池中的同一个”hello”的引用,

 接着System.out.println(s1.equals(s2));这里的equals在String类中被重写过,用来比较两个字符串的实际内容是否相等,即每一个字符是否相等,重写方法末尾会另做说明!!!因为比较的是字符串内容,s1,s2内容都是hello当然是相等的。 

(2) String ss1 = "aaa";
         String ss2 = new String("aaa");
         System.out.println(ss1 == ss2);  //false
         System.out.println(ss1.equals(ss2));  // true

ss2是new出来的,所以重新分配内存地址,当用==判断时,返回false,但是两个字符串的内容相同,所以用equals方法时,返回true。

(3)String sss1 = new String("aaa");
String sss2 = new String("aaa");
System.out.println(sss1 == sss2); //false
System.out.println(sss1.equals(sss2)); // true

 sss1和sss2都为new出来的对象,各占有一块内存空间,所以内存地址不同,但是字符串内容相同。

(4) 非String类,例如StringBuffer类 没有重写equals方法,所以不比较内容。==和equals都是比较的内存地址

StringBuffer stringBuffer = new StringBuffer("aaa");
StringBuffer stringBuffer2 = new StringBuffer("aaa");
System.out.println(stringBuffer == stringBuffer2); // false
System.out.println(stringBuffer.equals(stringBuffer2)); // false

java中==和equals的区别详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java:String使用equals和==比较的区别 的相关文章

  • 三维模型进行孔洞填充 (附 c++ 代码)

    代码的主要作用是对一个三维模型进行孔洞填充 并通过可视化工具展示填充后的结果 代码主要流程如下 加载原始三维模型数据 使用孔洞填充算法对模型进行孔洞填充 将填充后的模型数据保存到文件中 使用可视化工具展示填充后的模型 具体的代码解释如下 使
  • [改善Java代码]适时选择getDeclaredxxx和getxxx

    Java的Class类提供了很多的getDeclaredxxx方法和getxxx方法 例如getDeclaredmethod和getMethod成对出现 getDeclaredConstructors和getConstructors也是成对
  • LSC(Lens Shading Correction)——镜头阴影矫正

    产生原因 由于镜头原因导致光线丢失 注意红线 此时颜色就分离了 校正方法 网格化或者半径化方法 用一张灰度图来储存增益 各个像素点 增益恢复到最终的情况 网格化的方法通过划分网格节约存储空间 代码 不考虑像素存储 function LSCC
  • python二手房交易预测及展示系统

    一 项目目的及意义 项目的目的是在采集自贝壳二手房交易平台的成都市二手房成交数据的基础上 对数据进行处理和挖掘 以网站为载体实现二手房交易分析 卖方价格预测和买方房屋推荐三个主要功能 二手房交易分析功能服务于统计人员 对成都的二手房交易做完
  • 树莓派配置WiFi热点,远程播放视频小项目手把手教学

    1 安装树莓派OS镜像 Raspberry Pi OS Raspberry Pihttps www raspberrypi com software 下载官方镜像32位 一定不能下载最新版 下载最新版会导致后面步骤无法正常进行 我是用的是2
  • 51单片机点亮LED灯以及实现2盏LED灯的交替闪烁

    点亮LED灯 根据单片机原理图 将LED灯1和LED灯2介入单片机的口设为低电平即可 代码如下 include reg52 h sbit led1 P3 7 void main led1 0 给led1一个低电平 点亮 结果图 图中有一盏L
  • c# 创建只接收消息的窗口

    如果用自带的form 必须show后再hide 不是很好用 用以下代码即可 public class NotifierNativeWindow NativeWindow const string WindowName MessageOnly
  • Java源码 JavaWeb开发框架 代码 SSH SSM OA ERP CRM Java项目[Java通用框架源码及开发视频教程]

    Java源码 JavaWeb开发框架 代码 SSH SSM OA ERP CRM Java项目 功能简介 A 代码生成器 开发利器 生成Java各层次的类和JSP等文件 提高开发效率 B 阿里巴巴数据库连接池Druid 性能好的数据库连接池
  • python基础学习(4)—文件处理

    python学习基础之文件处理 文件和目录管理 os os path os walk open打开文件 文件和目录管理 python能够快速大量地处理计算机系统中地文件与文件夹 可以用OS包进行目录地创建与删除 文件删除 执行操作系统等操作
  • vue 登录页面记住密码功能

    vue iview element 一般用来快速搭建后台管理系统 登录页的记住密码功能也是必不可少的 记住密码快速登录功能 iview ui 思路 首次登录 记住密码 将密码存储到cookie中 退出登录 下次进来的时候 读取cookie登
  • chatgpt赋能python:PythonSave函数:保存和保护你的数据

    Python Save函数 保存和保护你的数据 Python Save函数是Python编程中最常用的函数之一 它允许开发者将数据保存到文件或数据库中 在未来的操作中访问和使用 无论你是处理大数据集还是需要保护数据免受未经授权访问 Pyth
  • c++ 文件操作

    1 根据需要引用头文件 include
  • ARM的MMU内存管理工作原理

    文章目录 1 虚拟地址 物理地址 逻辑地址 线性地址 运行地址之间的联系 2 MMU是什么 以及有mmu有什么作用 3 MMU RAM与arm core之间的关系 4 MMU的TLB与配置 5 MMU的地址映射 5 1 1M的section
  • 微信扫描普通二维码进入小程序

    微信扫描普通二维码进入小程序的方法 和代码没有什么关系 主要是在小程序平台进行设置 1 开发配置 开发 开发管理 开发设置 扫普通链接二维码打开小程序 2 配置规则 根据说明配置内容就行 后面有说带参数的配置和怎么在小程序里面获取参数 带参
  • 应急响应流程以及入侵排查

    归纳转载于 应急响应的整体思路和基本流程 FreeBuf网络安全行业门户不管是普通的企业 还是专业的安全厂商 都不可避免的需要掌握和运用好信息安全的知识 技能 以便在需要的时候 能够御敌千里 https www freebuf com ar
  • javascript实现关键字搜索和匹配关键字高亮效果

    效果图
  • 力扣1462.课程表

    题目描述 你总共需要上 numCourses 门课 课程编号依次为 0 到 numCourses 1 你会得到一个数组 prerequisite 其中 prerequisites i ai bi 表示如果你想选 bi 课程 你 必须 先选
  • linux 统计 程序运行时间

    这篇文章写的很详细 转一个 我们有时需要得到程序的运行时间 但我们也要知道 根本不可能精确测量某一个程序运行的确切时间 3 文献 4 中说的很明白 现摘录如下 我们平时常用的测量运行时间的方法并不是那么精确的 换句话说 想精确获取程序运行时
  • 【Linux常用命令整理】(一)

    找到了一个linux命令词典https www linuxcool com ls list files 显示指定目录下的文件及属性信息 常用参数 a 显示所有文件及目录 包括以 开头的隐藏文件 l 使用长格式列出文件及目录的详细信息 dat
  • docker安装配置elasticSearch

    安装ElasticSearch 启动镜像脚本 docker stop elasticsearch docker rm elasticsearch docker run name elasticsearch p 9200 9200 p 930

随机推荐

  • 苹果未能与恢复服务器取得联系解决

    由于系统时间导致 打开终端 输入 ntpdate time apple com
  • SQL 数据初级查询—实验报告

    一 实验目的 熟练掌握表中数据的各种查询功能 为后继学习作准备 二 实验属性 1 了解并掌握SQL管理控制器的使用 2 掌握基本表的数据查询 三 实验仪器设备及器材 1 每人一台计算机 2 计算机安装有SQL SERVER2008 四 实验
  • 【Scaled-YOLOv4】

    COCO数据集AP被刷到了55 4 FPS 15 核心是在YOLOV4上研究模型缩放 model scaling 技术 尽管在算法设计上 该文并没有带来重要亮点 但从工程应用的角度讲 Scaled YOLOv4 还是不错的 尤其是 YOLO
  • 单片机设计_语音识别分类智能垃圾桶(STM32 ESP8266 LD3320)

    想要更多项目私wo 一 电路设计 离线语音识别识别垃圾种类并且垃圾桶自动翻盖 说出唤醒词 垃圾桶 后 再说一句垃圾名称 语音识别模块端识别到相应关键词 便会将结果通过串口发送到STM32端 STM32端接着会发送打开相应垃圾桶盖的指令 6s
  • jitter单位_抖动(jitter)测量

    近年来 抖动 Jitter 已经成为通信工程师非常重视的信号特征 在数字系统中 时钟频率正在变得越来越高 随着速率的升组 在上升沿或是下降沿哪性是微小的变化也变得越来越重要 因为时钟或数据的抖动会影响到数据的完整性 建立时间和保持时间 并且
  • Mac移动硬盘无法使用/装载报错

    Mac移动硬盘无法使用 装载报错 事情起因 之前拔插机械硬盘的时候 忘记在关机前拔掉 导致移动硬盘直接断电 试用win电脑发现硬盘无损坏 插在MacBook上能识别但是无法显示里面的内容或进行操作 进入设置里对盘装载报错 装载 急救 启动盘
  • python实用脚本(五)——numpy的使用

    本期主题 python的numpy使用 往期链接 python实用脚本 一 批量修改目标文件夹下的文件名 python实用脚本 二 使用xlrd读取excel python实用脚本 三 通过有道智云API实现翻译 python实用脚本 四
  • C++:json解析,json与string互相转换

    Github nlohmann json nlohmann json简单用法 C 使用json json与string转换使用笔记
  • python绘制折线图显示点数据_python matplotlib 同时画散点图和折线图,如何将散点放在最上层???...

    代码 一 from random import choice class RandomWalk 一个生产随机漫步数据的类 def init self num point 5000 初始化随机漫步属性 self num point num p
  • RobotFramework 安装步骤

    Robot Framework 通用型黑盒自动化框架 框架优点 1 测试报告 2 执行部分用例 冒烟测试 3 初始化清除 一 安装Python3 建议3 6版本以上 二 安装RobotFramework 进入dos窗口 输入pip inst
  • 使用 Gitee + PicGo + Typora 搭建图床

    图床搭建过程简单 该博客只是为了记录并测试刚搭建好的图床 一 Gitee 1 新建仓库 填写好下图红框所示 并且选择开源 创建完后会跳转到仓库 记住这个网址 等下会在PicGo中用到 2 获取takon私人令牌 打开设置 点击私人令牌 生成
  • 最大子序列和问题以及确定序列起终点位置

    在学习数据结构遇到的第一个问题就是一个最大子序列和的问题 以PAT 点击打开链接 上的一道题作为例子来总结一下求解这类问题时一些常用的方法 网上讲述子列和问题的博客及文章已经很多了 这里就不在阐述穷举法和递归法的方式来求解了 有需求的小伙伴
  • Qt界面编程(二)—— Qt 5 帮助文档的详解

    学习Qt开发 肯定离不开帮助文档的使用 因为它不像 C 语言那样就那么几个函数接口 Qt的接口可以用海量来形容 常用的我们可能能记住 其它的真的没有必要去记 用到什么就去帮助文档查看用法 Qt5帮助文档地址 官网地址 https doc q
  • php微信怎么获取code,微信支付的Code如何获取?

    微信支付的问题 1 微信公众号帐号支付 2 微信支付授权目录 3 微信Code获取 用的是PHP开发 之前下载的是php微信sdk 下载集成到产品里一切正常 只要按官网步骤来做 应该不会出问题 后台应用环境变更 PHP只做中间层 后端是C
  • XAMPP 的安装配置(Linux 版)

    转载时请保留下面 以供大家加我MSN 增强交流 共同学习 姜庭华 msn jaimejth live cn 博客 http blog csdn net jaimejth 软件下载在以下网站 http www apachefriends or
  • 计算机网络 第四章网络层(5)BGP 协议路由器的结构远程接入 隧道技术虚拟专用网 和网络地址转换 NATRPB多播路由选择 网际组管理协议 IGMP多播 IP 地址

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 BGP 发言人交换路径向量 主干网还可发出通知 要到达网络 N5 N6 和 N7 可沿路径 AS1 AS3 BGP 协议的特点 BGP 协议交换路由信息的结点数量级是自治系统数
  • 【2022-New】Flutter doctor 检测报错,Android toolchain - develop for Android devices

    错误一 cmdline tools component is missing 缺少 cmdline tools 组件 解决方案 点击开发工具左上角 依次点击 file gt settings gt Appearance Behavior g
  • leetcode 312 戳气球

    312 戳气球 相关企业 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 戳破第 i 个气球 你可以获得 nums i 1 nums i nums i 1 枚硬币 这
  • 如何用python写OLS模型

    你好 使用 Python 写 OLS 模型可以使用 statsmodels 库中的 OLS 模块 首先 你需要导入所需的库 import statsmodels api as sm 然后 准备你的自变量和因变量的数据 这些数据可以使用 Pa
  • java:String使用equals和==比较的区别

    操作符的作用 1 用于基本数据类型的比较 2 判断引用是否指向堆内存的同一块地址 equals所在位置 在Object类当中 而Object是所有类的父类 包含在jdk里面 但并不适合绝大多数场景 通常需要重写 public boolean