java中关于字符串相等的比较问题

2023-10-29

  Java中比较两个字符串是否相等的问题

  Java中,关于比较两个字符串是否相等的问题,经常会出现。下面将分析使用 ==(注意:Java中 = 是赋值运算符,== 是比较是否相等) 和 equals()方法 来比较两个字符串相等的区别:

  简单一句话,==比较的是两个字符串的地址是否为相等(同一个地址),equals()方法比较的是两个字符串对象的内容是否相同(当然,若两个字符串引用同一个地址,使用equals()比较也返回true)。

  字符串比较之所以看起来复杂,是因为值类型和引用类型两种数据类型的区别:值类型,例如 int 类型,当定义并初始化两个 int 类型的变量,int i = 1;int j = i,这两个变量 i , j 存放的的就是1这个值,使用 if(i == j)判断时,自然返回 i 和 j 是相等的 。引用类型,例如字符串类型, 当定义并初始化两个字符串类型的变量,String s = "abc"; String s2 = s; 实际上是只创建了一个String类型的对象,该对象的值为abc,而 s 和 s2 都引用这一个对象。(关于值类型和引用类型的内容稍后会更新)

 基础篇:

  下面将举出两个例子,分析两种情况下的字符串比较问题:

  例1. 使用new关键字声明两个String类型的变量

           

        
1 String s1 = new String("abc"); 2     String s2 = new String("abc"); 3 4      //分别使用.equals()和==进行比较 5     if(s1.equals(s2)) 6     { 7       System.out.println("可以使用 equals 来比较"); 8     }else 9     { 10       System.out.println("不可以使用 equals 来比较"); 11      } 12      if(s1 == s2) 13      { 14        System.out.println("可以使用== 来比较"); 15      }else   16     { 17        System.out.println("不可以使用== 来比较"); 18     }

  运行程序发现,用equals比较返回true,用 == 比较返回false。原因如下:

  因为 == 比较的是两个字符串对象的地址是否相同(是否为同一个地址),当使用new关键字创建一个对象的时候,该对象单独占据一块存储空间,存放llg这个字符串的值。所以s1 s2两个字符串虽然值相同,但是存储的地址不是一个地址,例如两个人都叫l“李四”但是他们的住址不在一个地方。当使用==来比较的时候,比较的是两个字符串的地址是否是同一个,所以返回false。但是使用equals()方法比较这两个字符串,将会比较两个字符串的值是否相同,所以返回true。

  例2. 正常情况下的字符串声明并定义。   

      //声明并初始化两个赋值一样的字符串

      String s1 = "abc";
      String s2 = "abc";

      //使用.equals()方法比较两个字符串是否相等
      if(s1.equals(s2))
      {
         System.out.println("可以使用 equals  来比较");
      }else
      {
         System.out.println("不可以使用 equals  来比较");
      }

      //使用 == 比较两个字符串是否相等
        if(s1 == s2)
        {
         System.out.println("可以使用 == 来比较");
        }else
        {
          System.out.println("不可以使用 == 来比较");
        }

  程序经过运行,发现两个方式都返回true。那么这是为什么呢?原因如下:

  一般我们认为,栈中存放基本类型的变量和对象的引用变量,而new出来的对象和数组存放在堆中。然而除此之外还有一块区域叫做常量池。像我们通常想String s1 = "abc"; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = "abc"这样一个对象之后,"abc"就存储到了常量池中,当我们创建引用String s2 = "abc" 的时候,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建。所以使用 == 比较时,因为地址相同,所以比较的结果是true。

  那么问题回来了,既然是有常量池,是不是字符串如果不是new出来的(一般也不会这么new,声明字符串变量一般像例2这么写),那么这些字符串都是从常量池引用同一个对象,所以用 == 比较就行了?答案是可以。

为什么要有一个equals呢?难道只因为有人会故意new一个String出来吗?当然不是,初学者请先理解上面的内容。

进阶版:

近期更新

 

  

 

  

  

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

java中关于字符串相等的比较问题 的相关文章

  • VCCLCompilerTool 属性 -VS2013版

    VCCLCompilerTool类型有以下成员 以下vcxproj项目信息文件例子来分析
  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 六)

    AppStorage 应用全局的UI状态存储 AppStorage是应用全局的UI状态存储 是和应用的进程绑定的 由UI框架在应用程序启动时创建 为应用程序UI状态属性提供中央存储 和LocalStorage不同的是 LocalStorag
  • vue3. v-model: 变量名

    父组件中定义index变量 子组件需要这个变量 并且会更改 但是 众所周知 vue是单向数据流 子组件是不能修改父组件的参数的 唯一的方法 就是通过emit 通过父类修改变量 从而修改子类里面的prop值的参数 vue3中支持一个组件可以传
  • chromedriver没有win64版本?使用chromedriver时 WebDriverException报错

    chromedriver版本及使用问题 chromedriver没有win64版本 使用chromedriver时 WebDriverException报错 经过探索笔者发现64位系统安装win32位就可以了 亲测可用 所以没有64位版本的
  • STL : shared_ptr 智能共享指针

    目录 Shared ptr 共享指针 定义 特征 区别 声明创建 1 空智能指针 2 定义指向 初始化 3 构造函数 4 异常指向 5 自定义释放规则 成员方法 示例 注意事项 问题 共享指针是怎么计数的 智能指针 可以在适当时机进行自动释
  • Qt编译时提示error: multiple definition重复定义

    今天在用QT 5 4 1 编译程序时 提示error multiple definition 错误 以下红色字体为错误提示 D Wind PLT Projects BCS tmp moc Cntrlane cpp 156 error mul
  • 带头结点的单链表head为空的判定条件---腾讯2014研发笔试卷

    带头结点的单链表head为空的判定条件 正确答案 B 你的答案 C 错误 head NULL head gt next NULL head gt next head head NULL 添加笔记 收藏 纠错 B 注意是带头结点 如果不带头结
  • MySQL零基础入门教程(一)

    MySQL 安装 没有安装环境的请看这篇教程 链接 MySQL Navicat安装配置教程 超级详细 保姆级 MySQL 连接 root host mysql u root p Enter password 在登录成功后会出现 mysql
  • h2database源码解析-表和索引

    目录 表 索引 MVPrimaryIndex MVDelegateIndex MVSecondaryIndex 索引更新 表 h2使用类MVTable表示数据库表 h2的表数据是基于主键排列的 这种表也叫做主键索引表 这也就意味着表必须有主
  • # Carla简单入门-0 Carla的安装

    Carla简单入门 0 Carla的安装 本文写于2023年7月 文中所展示的版本为Ubuntu20 04以及Carla0 9 14 不同版本可能有一定的不同 欢迎各位伙伴们把遇到的问题和解决办法与其他人分享 这篇文章主要面对想要上手Car
  • C51单片机串口工作的四种方式总结

    方式0 同步移位寄存器输入输出方式 1 利用移位寄存器实现串行 并行的转换 功能 2 波特率 fosc 12 3 RXD P3 0 用于串行数据的输入和输出 TXD P3 1 充当输出的移位时钟 4 数据大小 8位 5 方式0发送 串口接口
  • Python pandas read_excel打开读取Excel(.xlsx)报错 xlsx file; not supported解决方法

    本文主要介绍Python中 使用pandas read excel打开读Excel xlsx 文件报错 xlrd biffh XLRDError Excel xlsx file not supported的解决方法 原文地址 Python
  • python自动化处理邮箱

    一 邮箱和相关库介绍 邮箱地址介绍 3547384 qq com 账户信息 3547384 分割符号 qq com 服务商地址 邮箱协议 SMTP 端口25 邮件发送协议 需要账号密码 POP3 端口110 邮箱操作协议 下载所有邮件并可选
  • R语言 第五次课堂小测 初级绘图

    1 箱线图 data data frame x rnorm 12 y rep 1 3 each 4 par mfrow c 1 4 boxplot data x boxplot x y data data boxplot x y data
  • 如何正确实施人工智能

    https www toutiao com a6687407462464619021 人工智能 AI 在人们的日常工作和生活中日益普及 而且企业越来越依赖于人工智能来完成一系列任务 因此IT团队实施人工智能面临的风险越来越高 其实施成功与否
  • Postgres 快速入门(一)

    Postgres 快速入门 简介 postgres 是一款开源 免费的对象 关系数据库 登陆 psql U 用户名 d 数据库名 h 127 0 0 1 p 5432 参数含义如下 U指定用户 d指定数据库 h指定服务器 p指定端口 如果
  • 点云3D目标检测学习(1):pointnet、pointnet++模型

    3D目标检测学习笔记 开始正式进入3D目标检测的学习 1 点云数据 无序性 只是点而已 排列顺序不影响 近密远疏 非结构化数据 直接CNN有点难 2 PointNet CVPR2017 Pointnet的出发点 1 由于点的无序性导致 需要
  • libcurl 的简单实用(一)

    两种请求方式 Easy interface CURL curl NULL curl global init 初始化 curl easy init 获取一个句柄 curl easy setopt 设置参数 url 地址 必选项 curl ea
  • bp-CompareArrayContent

    数组像收纳盒 两个数组的比较之前需要归置归置 然后一一对比 Plan 1 static bool CompareArrayEquelByCycle int array1 int array2 if array1 Length array2
  • R语言5_安装Giotto

    环境Ubuntu22 20 R4 1 已开启科学上网 第一步 更新服务器环境 进入终端 键入如下命令 apt get update apt install libcurl4 openssl dev libssl dev libxml2 de

随机推荐

  • 解决eclipse 红色代码行

    类似于这样的 解决方式 步骤一 Window gt show view gt Other gt Java gt Coverage 步骤二 点击Remove all Sessions 两个 按钮 https bbs csdn net topi
  • RL中的on-policy与off-policy的一点理解

    笔者在刚开始学习RL的时候 对on policy和off policy的理解也一直不是很清晰 我用q leaening和Sarsa作对比来介绍这两者的区别 Q learning伪代码 Sarsa伪代码 可以看出这两个的不同 1 q lear
  • Apache Hudi简介、与Kudu、Hive、 HBase对比

    一 Apache Hudi 数据实时处理和实时的数据 实时分为处理的实时和数据的实时 即席分析是要求对数据实时的处理 马上要得到对应的结果 Flink Spark Streaming是用来对实时数据的实时处理 数据要求实时 处理也要迅速 数
  • 依赖注入(转载)

    依赖注入那些事儿 转载 依赖注入那些事儿 1 IGame游戏公司的故事 1 1 讨论会 话说有一个叫IGame的游戏公司 正在开发一款ARPG游戏 动作 角色扮演类游戏 如魔兽世界 梦幻西游这一类的游戏 一般这类游戏都有一个基本的功能 就是
  • window.print() 前端实现网页打印详解

    目录 前言 一 print 方法 二 打印样式 2 1使用打印样式表 2 2使用媒介查询 2 3内联样式使用media属性 2 4在css中使用 import引入打印样式表 三 打印指定区域部分内容 3 1方法一 3 2方法二 3 3方法三
  • C++中inline用法

    1 引入内联关键字原因 在C 中 解决一些频繁调用的小函数大量消耗栈空间 栈内存 特别引入inline修饰符 因为栈空间是有限的 频繁大量的使用会造成栈空间不足而程序出现问题 函数死循环或者递归层级过深 若定义函数宏 不会招致函数调用带来的
  • 实现http服务器端

    1 HTTP Hypertext Transfer Protocol超文本传输协议 超文本是可以根据客户端请求而跳转的结构化信息 HTTP协议是以超文本传输为目的而设计的应用层协议 是基于TCP IP实现的协议 实现该协议就相当于实现了We
  • 大数据毕设 - 深度学习车牌识别系统(python 机器视觉 opencv)

    文章目录 1 前言 1 课题背景 2 效果演示 2 1 图片检测识别 2 2视频检测识别 3 车牌检测与识别 4 HyperLPR库 4 1 简介 4 2 特点 4 3 HyperLPR的检测流程 4 4 安装 4 5 Python 依赖
  • vue.js中this.$emit的理解

    对于vue js中的this emit的理解 this emit 30340 29702 35299 65306 this emit increment1 这个位子是可以加参数的 其实它的作用就是触发自定义函数 看例子 div p tota
  • 【maven】解决问题:package时,编译时 本地虽有jar文件,但仍然去网上下载

    去掉 remote repositories文件 如下图 maven就直接用本地的jar了
  • gitlab 安装_GitLab入门详解(一) 安装部署

    Gitlab安装配置 1 环境准备 操作系统 CentOS Linux release 7 4 1708 Core 内存 2G及以上磁盘 50G安全 关闭防火墙 selinux 2 安装Gitlab所需的依赖包 yum install cu
  • 常指针与常引用

    对象的引用和对象的指针 为了说明对象指针与对象引用的相关知识 我们来看一下下面的例子 在这个类中 我们定义了两个数据成员 一个横坐标一个纵坐标 另外 还定义了一个构造函数 还有三个成员函数 其中printInfo 函数是一个常成员函数 那么
  • 接口自动化测试框架-jenkins部署在阿里云上,邮件发送失败问题解决方法。

    欢迎大家关注我的个人公众号 小朱谈软件测试 全是干货哦 接口都整完了 发现本地调用发送邮件是通的 但是放jenkins上就不行 最后发现是因为阿里云把25端口禁用了 那么我们就要在程序里改了 之前写的方法端口是25 因为阿里云25端口不通
  • 超级好用的css属性——clip-path

    目录 基本概念 circle 函数 ellipse 函数 polygon 函数 path 函数 总结 clip path是CSS3中的一个属性 用于在元素上创建一个裁剪区域 以显示元素的一部分 它允许您选择性地显示元素的某个部分 而隐藏其他
  • 使用Nginx部署前后端分离项目并实现负载均衡

    1 打包后端项目 jar包 IDEA里执行package将后台工程打成jar包 上传至服务器 我将jar包上传至了target目录 cd至target目录 执行以下命令启动后台 表示后台运行 退出不会结束进程 root zy host ta
  • 【微信小程序】小程序模态框里面的问题换行问题

    写项目的时候使用到了小程序提供的模态框 但是文字换行问题一直有问题 设计稿 模态框 找了好久终于找到了一个可以实现换行的办法就是在你需要换行的添加 r n就可以了 下面来看下效果图 注释 还有一点在工具里面还是看不出来效果的 只有在真机上面
  • svn代码回滚命令

    svn代码回滚命令 取消对代码的修改分为两种情况 第一种情况 改动没有被提交 commit 这种情况下 使用svn revert就能取消之前的修改 svn revert用法如下 svn revert R something 其中someth
  • ubuntu 设置鼠标手势和鼠标灵敏度

    ubuntu设置鼠标触摸手势 首先确认你的触摸板是否支持多点操作以及你使用的用户是否有权限读取触摸板一般来说都没有问题 安装必要的包 自定义手势功能 让它开机启动 修改触摸板指针移动速度 1 ubuntu设置鼠标触摸手势 fusuma是gi
  • ffprobe -show_packets和-show_frames之间的区别

    一 show packets 我们只查看视频的packets ffprobe show packets rtmp jdpull jd com live 14042733 of xml grep video 结果如下
  • java中关于字符串相等的比较问题

    Java中比较两个字符串是否相等的问题 Java中 关于比较两个字符串是否相等的问题 经常会出现 下面将分析使用 注意 Java中 是赋值运算符 是比较是否相等 和 equals 方法 来比较两个字符串相等的区别 简单一句话 比较的是两个字