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

相关推荐

PTA 学生信息的那些操作:添加记录(结构体)

这是河南工业大学自主命题的一道基础题,题目如下: 有一学生成绩表,包括学号、姓名、3门课程成绩。已知该成绩表按学号升序排序。请编程实现,添加一个新的学生信息,且使成绩表仍按学号有序;若待添加的学号与已有学号重复,则输出错误信息,拒绝添加。 输入格式: 首先输入一个整数n(1<=n<=100),表示学生人数; 然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。 最后一行输入一个待添加的学生信息,包括学号

weixin_63617665的博客 3156

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

用示波器抓取同步Buck自举电容波形:从充电回路到SW节点振铃的完整分析

本文通过实测TI TPS54561和MPS MPQ4572同步Buck芯片,详细解析了自举电容在充电、维持和放电三个工作阶段的波形特征。重点揭示了电感泄放回路与充电回路重叠时,在SW节点引发的振铃现象及其产生机理,并提供了串联阻尼电阻等有效的工程抑制方法。文章结合示波器实测,为硬件工程师提供了从波形观测到问题调试的完整实践指南。

weixin_29276847的博客 373

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

Unity游戏开发实战:手把手教你用C#实现一个简单的反向运动学(IK)控制器

本文详细介绍了在Unity游戏开发中如何使用C#实现一个简单的反向运动学(IK)控制器。通过建立骨骼层级结构、实现CCD算法和角度限制,开发者可以轻松创建自然的角色动画效果。文章还提供了可视化调试工具和性能优化方案,帮助提升开发效率。

weixin_42523711的博客 244

王珊数据库系统概论第5版视频教材

目录 隐藏 说明:本课程共包括1种电子书、84个高清视频(共68课时)、1种纸质书(赠品)。 网授课程 王珊《数据库系统概论》(第5版)网授精讲班【共68课时】 序号 名称 课时 1 第1章 绪 论(1) 00:32:25 2 第1章 绪 论(2) 00:17:03 3 第1章 绪 论(3) 00:50:19 4 第1章 绪 论(4) 00:20:37 5 第1章 绪 论(5) 00:24:47 6 第2章 关系数据库(1) 00:47:23 7 第2章 关系数据库(2) 00:14:48 8 第2章 关系

mrtaoy96的博客 1147

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

深入解析DisplayPort(DP)接口:从主链路到辅助通道的全方位技术剖析

本文深入解析DisplayPort(DP)接口的核心技术架构,重点剖析了其三大功能模块:承载视频/音频数据洪流的Main-Link主链路、负责链路训练与设备控制的AUX CH辅助通道,以及实现智能交互的HPD热插拔检测。文章详细阐述了主链路的可伸缩Lane配置、嵌入式时钟与数据成帧机制,以及辅助通道在设备发现、动态优化信号质量(链路训练)中的关键作用,揭示了DP接口实现高效率与灵活性的设计哲学。

weixin_29267307的博客 489

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

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1546

【sealos安装指南】基于 Sealos 安装 Kubernetes 1.33.6 高可用集群

本文介绍使用Sealos工具快速搭建Kubernetes集群的详细指南。Sealos简化了K8s部署流程,自动完成系统调优,适合新手学习使用。文章提供了服务器规划、环境准备、在线/离线两种安装方式的具体步骤,包括主机名设置、swap关闭、数据目录配置等。重点讲解了Sealos的安装命令参数说明,以及添加/删除节点等常用操作。推荐使用Calico网络组件确保稳定性,并附有安装成功后的验证截图。该指南能帮助用户快速搭建一个包含master和worker节点的K8s集群,底层基于containerd运行。

欢迎你们到来,希望能帮到大家 463

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

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

weixin_42524013的博客 866

【MTK平台】【wpa_supplicant】关于wpa_supplicant/p2p_supplicant.c文件的介绍

本文主要介绍external/wpa_supplicant_8/wpa_supplicant/p2p_supplicant.c 这个文件这个文件里面有个核心的方法就是。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 725

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

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

qq_43411521的博客 2568

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

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

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

余额充值