java中String的相等判断(==和equals())详解

字符串相等判断:Java中的equals()与==的区别与用法 本文通过三妹与二哥的对话,详细讲解了Java中字符串比较的两种方式:==和.equals()的区别。==比较对象的内存地址,而.equals()比较内容。通过双胞胎的例子形象说明区别,并分析了String类的.equals()源码实现。文章还介绍了更安全的比较方法Objects.equals()和支持多种字符序列比较的.contentEquals(),最后通过6道测试题巩固知识点。全文通俗易懂,适合Java初学者理解字符串比较的核心概念。 阅读详情

以前只是一直用equals()来判断字符串变量是不是和某个定值相等,知道这样比较稳妥,但是我想有必要说说清楚这其中的原理。

首先,引入java常量池的概念,也就是编译的时候,常量们会被确定在.class文件中,java常量池中一共有如下这么多内容:

常量表类型
标志值(占1 byte)
描述
CONSTANT_Utf8
1
UTF-8编码的 Unicode字符串
CONSTANT_Integer
3
int类型的字面值
CONSTANT_Float
4
float类型的字面值
CONSTANT_Long
5
long类型的字面值
CONSTANT_Double
6
double类型的字面值
CONSTANT_Class
7
对一个类或接口的符号引用
CONSTANT_String
8
String类型字面值的引用
CONSTANT_Fieldref
9
对一个字段的符号引用
CONSTANT_Methodref
10
对一个类中方法的符号引用
CONSTANT_InterfaceMethodref
11
对一个接口中方法的符号引用
CONSTANT_NameAndType
12
对一个字段或方法的部分符号引用

所以String也会被编译到常量池中。

下面来看一个例子。

比如:

String str1 = "cityu";
String str2 = "cityu";
String str3 = "city"+"u";
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str2==str3);

------------------------------------------

result:

true;

true;

true;

根据这个结果来看,所有的等值常量都是相等的,而str3两个常量相加,最后也得到常量。java虚拟机会保证一个String常量只有一份copy。所以其实这里三个字符串都是对“cityu”这个常量的引用。

但是如果用到了new关键字,创建的是对象而不再是常量。

比如:

String str1 = "cityu";
String str2 = new String("cityu");
String str3 = "city"+new String("u");
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str2==str3);
------------------------------------------

result:

false;

false;

false;

使用new关键字创建的字符串,str2会被放在操作数栈中,而字符串“cityu”会在常量池中出现,然后被复制到堆中,并且在堆中的这一份拷贝由str2来引用,所以new字符串这个动作一共会产生一个字符串的两份拷贝和一个引用(如果不是匿名的话)。
那么在这里,str1引用的是常量池中那一份拷贝,而str2指向的是堆中的那一份拷贝,虽然他们的值相同,但是并不是引用同一个拷贝,结果自然就是false。

当然,可以使用String的一个函数:intern();

先看例子:

String str1 = "cityu";
String str2 = new String("cityu");
String str3 = "city"+new String("u");
System.out.println(str1==str2.intern());
System.out.println(str1==str3.intern());
System.out.println(str2==str3.intern());

------------------------------------------

result:

true;

true;

false;

intern()函数是用来扩充JVM常量池的,一个字符串调用到intern的时候,会查找常量池中是否有相同内容的Unicode字符串常量,如果有,返回该常量的引用值,如果没有就创建一份常量池拷贝并且返回引用,创建之后原来在堆中的拷贝和操作数对象还是会保持不变。所以会有以上的运行结果。

说到这里,用“==”来判断字符串的结果应该已经很清楚了。

那么想要比较稳妥的比较字符串的值的话,还是推荐用equals()。

下面来介绍一下java的equals()函数。

equals()函数的最高层参数是Object对象,他的源码是:

public boolean equals(Object obj) {
        return (this == obj);
}
可以看出返回的是两个对象是否相等的布尔值。

然而沼跃卵子早已看穿了一切,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对象相等,或者内容相等,返回值就是true。

看到这里我想不用多说,比较两个字符串的值是否相等,当首推equals()函数。

虽然说清楚了用法,但是还没有细节到JVM的指令部分,接下去继续研究。




学习-Java字符串之String类创建字符串之使用equals和==判断字符串是否相等 ** 本关任务:使用 new 创建两个字符串(获取键盘输入的两个字符串,中间用空格分隔),并分别通过 equals 和 == 判断字符串是否相等。 ** 相关知识:为了完成本关任务,你需要掌握: 1.什么是字符串 2.字符串变量的声明 3.创建字符串的三种方式 4.equals 和 == 答案 什么是字符串 我们已经知道,数字、字母、汉字、符号等等都是字符,如 9、A、a、国、& 等。 那么,什么是字符串呢? j 是一个字符,a、v、a 也是字符,现在我将这些字符连接起来,java 就是一个由 4 阅读详情

相关推荐

SGX软硬件栈(二)——硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。 内核权限硬件指令-ENCLS 如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enc

小气球归来的博客 2889

java中String的“==”和equals判断相等性

1. 首先String不属于8种基本数据类型,String是一个对象。   因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null; 3. String str=”kvill”与String str=new String ...

weixin_33847182的博客 328

SORT算法在遮挡下总跟丢?深入OC-SORT源码,拆解其三大创新点如何解决卡尔曼滤波的顽疾

本文深入解析OC-SORT算法如何通过三大创新点解决多目标跟踪中的卡尔曼滤波顽疾。OC-SORT引入在线平滑虚拟轨迹技术(OOS)、观测中心动量匹配机制(OCM)和基于最后观测的轨迹恢复(OCR),显著提升了遮挡场景下的跟踪性能。实验数据显示,相比传统SORT算法,OC-SORT在MOT17数据集上MOTA提升5.7%,遮挡恢复成功率提高64.2%,为Multi-Object Tracking领域带来突破性进展。

weixin_42547431的博客 240

Educoder-学习-Java字符串之String类创建字符串之使用equals和==判断字符串是否相等

掌握知识点 equals == 方法的使用 创建字符串的三种方式 通关源码 import java.util.Scanner; public class StrTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.next(); String s1 = scanner

qq_39123467的博客 2563

基于Python的高考志愿辅助填报系统

在实际应用中,系统需要处理更复杂的数据,包括更多的高校和专业信息、更详细的录取规则、以及用户的历史选择等。系统需要提供用户友好的界面,让考生输入自己的信息和偏好,然后通过后端的模型计算出推荐的志愿列表。此外,系统还应该提供一些个性化的服务,如根据考生的输入动态调整推荐策略、保存用户的填报历史和偏好等。特征可能包括考生的分数、所在省份、文理科类别、专业偏好、高校的地理位置、排名、专业的就业前景等。3. **推荐逻辑**:根据用户的分数和专业偏好,结合历史录取数据,使用简单的算法来推荐可能录取的高校和专业。

coder_wwwdy的博客 1977

2024年数字IC秋招-速腾聚创-数字芯片验证工程师-笔试题

笔试题型:单选 + 问答题笔试平台:牛客(手机+电脑监控)笔试时间:1hA. len取10的概率是1/2;B. len取10的概率是1/3;C. len取10的概率是1/4;D. len取10的概率是1;

qq_42135020的博客 1399

java使用==和equals()判断字符串是否相等

equals()方法: equals()方法用于将字符串与指定的对象比较。String类中重写了equals()方法用于比较两个字符串的内容是否相等。 语法: //object:与字符串进行比较的对象 public boolean equals(Object anObject) 返回值: 如果给定对象与字符串相等,则返回true;否则返回false。 public class Test { public static void main(String args[]) {

li_w_ch的博客 1万+

Intellij IDEA 使用教程(一)Jdk安装和配置

一.JDK下载 这里下载的是Java SE 8u181 64位版本。可以根据自己电脑配置来选择不同版本。 官网下载JDK 二.安装JDK 双击运行jdk-8u181-windows-x64.exe安装程序 选择安装目录,然后点击下一步 等待安装 安装JRE,就是java的运行环境,可以安装在java目录下 等待安装 安装完成。点击关闭。 三.java环境变量配置 关于环境变量的配置,...

岁月不饶人,我亦未曾饶过岁月 4053

java 类 equal_java – 如何为类定义多个equals()函数

你的问题有点模糊,但如果唯一的目的是根据你想要使用的属性而有不同的排序算法,那么请使用Comparator.public class Person {private String name;private int age;public static Comparator COMPARE_BY_NAME = new Comparator() {public int compare(Person on...

weixin_42123296的博客 1226

使用C/C++复制图像

要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。函数将输出图像保存到文件中。在这个示例中,我们假设输入图像是一个常见的JPEG图像,文件名为"input.jpg"。

CyberWarpX的博客 729

【Claude Code 实战】第十章:DevOps 与 CI/CD 集成 / 光子AI

本章摘要:探讨Claude Code在DevOps与CI/CD集成中的应用。DevOps作为现代软件工程核心,结合AI技术实现自动化全流程,从代码提交到生产部署。通过CALMS模型(文化、自动化、精益、度量、分享)解析DevOps理念,对比传统瀑布模式与DevOps模式差异,展示AI如何加速Dockerfile编写、CI/CD配置等任务。典型示例显示AI可将原本30-60分钟的手动配置缩短至1-2分钟,大幅提升DevOps效率。

AI天才研究院 367

java string判断_java中String的相等判断(==和equals())详解

以前只是一直用equals()来判断字符串变量是不是和某个定值相等,知道这样比较稳妥,但是我想有必要说说清楚这其中的原理。首先,引入java常量池的概念,也就是编译的时候,常量们会被确定在.class文件中,java常量池中一共有如下这么多内容:常量表类型标志值(占1 byte)描述CONSTANT_Utf81UTF-8编码的Unicode字符串CONSTANT_Integer3int类型的字面值...

weixin_42524013的博客 866

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java中判断相等 (== 与 .equals())

1.Java中有两种判断相等的方法: 1.1首先是==运算符 对于基本类型而言,==运算符比较的是值是否相等(本质也是比较的地址,因为常量在常量池中的地址不可改变) int a = 3; int b = 3; System.out.println(a==b);//结果为true 对于引用类型而言,==运算符比较的是变量是否指向同一引用对象(以String为例); ...

qq_43411521的博客 2568

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java中怎么判断相等_Java中判断相等 (== 与 .equals())

1.Java中有两种判断相等的方法:1.1首先是==运算符对于基本类型而言,==运算符比较的是值是否相等(本质也是比较的地址,因为常量在常量池中的地址不可改变)int a = 3;int b = 3;System.out.println(a==b);//结果为true对于引用类型而言,==运算符比较的是变量是否指向同一引用对象(以String为例);String str1 = "abc";Stri...

weixin_28835789的博客 5627

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

越来越好ing的博客 6万+

java-String的相等判断(==和equals())

1.问题 1. String str1 = "cityu"; String str2 = "cityu"; String str3 = "city"+"u"; System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str2==str3);

hehecx123的博客 2061

Java中String判断相等equals与==的区别以及StringBuilder的equals

Java中String类型具有一个equals的方法可以用于判断两种字符串是否相等,但是这种相等又与运算符==所判断的“相等”有所不同,接下来进行分析,结论由程序进行验证 String的equals函数只要两个字符串“看起来”相等,就可以返回true,“看起来”相等意思指的是,当两个字符串对象所存放的内容相同时,不需要存放的内存地址相同,但是==判断则只有当判断的两个变量所使用的内存地址为相同时

纸上得来终觉浅 2万+

为什么String比较是否相等的时候用equals而不用==

为什么String比较是否相等的时候用equals而不用==为什么String比较是否相等的时候用equals而不用== 为什么String比较是否相等的时候用equals而不用== 初学Java的时候,经常会搞混String的比较,为什么两个String在做比较的时候,老师说让我们不要用==,要用equals进行比较,我试了一下发现了一个很有意思的情况。 代码片. /** * 测试String...

qq_37465844的博客 2166

Java 中String 的相等比较(转)

Java 中String 的相等比较(转) 转载 地址:http://wenku.baidu.com/view/d223a71714791711cc791737.html 判断两个字符串是否相等的问题。在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写。在java中,用的是equals(); 例:A字符串和B和字符串比较: if(A.equals(B)){ } 返回t...

qq_34851605的博客 4822

Java基础-“==“和“equals“相等判断

在Java中有 “==” 和 “equals” 两个可以用做对象或变量的相等判断。 先说说操作符 “==”,由于没有找到啥官方文档对该操作符的说明,结合网上所学以及Java核心技术卷的一句解释: 总结说就是“==”操作符它判断的是两个对象的引用地址(堆内存)是否相等。 当适用于基本数据类型(byte, short, char, int, float, double, long, boolean)及其相应的包装类型(Byte, Short, Charater, Interger, Float, Double

qq_33829353的博客 532

Java 判断两个String类型的字符串是否相等

很多人喜欢直接用“==”来判断 public static void main(String[] args){ String str1="Java"; String str2="Java"; System.out.println(str1==str2); } 当然,像这种情况是对的。 但是你看这种 public static void main(String[] args){ Scanner sc=new Scanner(System.in); String str1="Java";

shaoNianABin123的博客 8826

java判断string类型相等

字符串相关学习资料:https://edu.51cto.com/video/3832.htmlhttps://edu.51cto.com/video/4055.htmlJava中判断String类型相等的实现方法 作为一名经验丰富的开发者,我经常被问到如何判断Java中的String类型是否相等。这个问题看似简单,但其...

weixin_42494628的博客 257
上一篇: 小问题记录:JAVA String.split
下一篇: leetcode majority element
MR_LUXY
博客等级 码龄16年 20粉丝 43原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值