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 阅读详情

相关推荐

Win11+Ubuntu18.04+Ubuntu20.04三系统安装与卸载

以下情况均为个人情况:1.插入启动 U 盘后,登录时可以按F12(拯救者Y7000,不同电脑不同)进入BIOS,选择从启动盘启动。2.。3.5.在win基础上,安装第一个Ubuntu系统后,系统启动界面类似如下第一张图,Ubuntu不显示版本号。安装第二个Ubuntu系统后,系统启动界面如下第二张图,如果想更改启动项的名称,可自行查阅相关资料。

weixin_61686291的博客 2539

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

FP7195升降压恒流驱动IC:从AC/DC 12~24V输入到稳定输出的高效电源设计实战

本文详细解析FP7195升降压恒流驱动IC的工作原理与应用实战。该芯片支持4.5V-32V宽输入范围,能自动切换升降压模式并保持输出恒定,特别适用于车载LED照明、工业电源等电压波动场景。通过实际案例分享PCB布局、元件选型及调试技巧,帮助工程师实现高效稳定的电源设计。

vodka的博客 955

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

UOS系统手动添加1920x1080分辨率:xrandr命令详解与持久化配置

本文详细介绍了在UOS系统中使用xrandr命令手动添加1920x1080分辨率的方法。针对系统设置中缺失该选项的常见问题,文章提供了从识别显示设备、使用cvt生成模式、添加并切换分辨率,到通过修改.profile文件实现持久化配置的完整步骤。同时涵盖了虚拟机环境、设备名识别及排错等进阶内容,帮助用户彻底解决UOS分辨率配置难题。

weixin_29300931的博客 499

从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进

本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。

weixin_28273593的博客 452

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万+

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 622

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

大数据开发工程师必备面试题与解答

大数据开发岗位一直是互联网行业的热门方向,面试过程中既考察基础知识,也关注实际项目经验和问题解决能力。本文整理了等核心组件相关的高频面试题及参考解答,帮助大家高效准备面试。大数据面试不仅考察基础理论,更看重项目经验与问题解决能力。本文涵盖了等核心知识点及调优思路,希望能帮助你在面试中游刃有余。

X2829352498的博客 302

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

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

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

weixin_42524013的博客 866

YOLO26改进策略【卷积层】| CVPR 2025 频率动态卷积 FDConv 频域分权重提多样性 + 双调制降冗余,增强特征表征能力

本文记录的是利用FDConv 算子改进 YOLOv11 的卷积层特征提取层。(Frequency Dynamic Convolution)通过傅里叶域权重划分与空间-频率双调制机制结合,实现YOLOv11特征提取中频率多样化的动态卷积与空间自适应的频带调制。本文利用算子,通过傅里叶不相交权重生成频率差异化的并行卷积核以丰富特征表达,再通过核空间调制和频带调制结合局部-全局信息、适配图像空间异构性,同时依托固定参数预算实现轻量化设计,对YOLOv11中目标的低频语义特征与高频细节/边界特征进行针对性增强、抑制

Limiiiing的博客 476

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

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

qq_43411521的博客 2568

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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、付费专栏及课程。

余额充值