it编程 > 编程语言 > Java

Java字符串比较结果不同?常量池和==与equals的区别一次讲透

6人参与 2026-08-03 Java

public class text{
public static void main(string[] args){
   string s1 = "java";
   string s2 = "java";
   string s3 = new string("java");
   system.out.println(s1==s2);//true
   system.out.println(s1 == s3);//false
   system.out.println(s1.equals(s3));//true

仔细看这段代码,明明三个字符串的内容都是java,运行结果却不相同,核心原因在于java字符串常量池的存在,以及==和equal的本质区别。

一、java字符串常量池

为了提升程序性能,减少内存开销,java专门开辟了一块字符串常量池(string constant pool),它是属于方法区的一部分,是专门用于储存字符串常量的缓存区域。

它的核心规则是:

1,当使用双引号“”直接赋值创建字符串时,jvm会先去字符串常量池中检查,是否已经存在相同内容的字符串;

2,如果常量池中已经存在,直接返回常量池中该字符串的内存地址,否则,在常量池中创建新对象,再返回其地址;

二、new string 创建对象的底层逻辑

当使用new string("java")创建字符串时,执行逻辑完全不同,jvm会做两件事:

1,先去字符串常量池中检查是否存在java,不存在则在池中创建;

2,在堆内存中重新开辟一个新的内存空间,创建一个新的string对象,堆中对象的内容指向常量池中的java字符串;

3,最终变量s3储存的是堆内存中新建对象的地址,而非常量池的地址。

三、==和equal的本质区别

(1)“==”运算符

1,对于基本数据类型比较的是变量的值。

2,对于引用数据类型比较的是对象的内存地址,而非内容。

(2)equals()方法

1,equal方法是object类中的方法,string类对其进行了重写。

2,string重写后的equal方法,会逐字符比较两个字符串的内容是否完全一致,和内存地址无关。

四、其他常见错误

(1)字符串拼接的常量池陷阱

string s1 = "hello";
string s2 = "world";
string s3 = "helloworld"
string s4 = "hello"+"world";
string s5 = s1 + s2;
system.out.println(s3==s4);//true
system.out.println(s3==s5);//false

原因:

(2)null值调用equals的空指针问题

string s1 = null;
string s2 = "java";
system.out.println(s1.equal(s2));//会抛出nullpointerexception
system.out.println(s2.equal.(s1))

所以在做字符串判等时,用已知的常量字符串调用equals方法,避免空指针异常。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

java comparable接口怎么用?内部比较器用法详解

08-03

Java异常处理怎么学?一文详解try catch finally使用技巧

08-03

java运行排错,新码旧jar问题及解决

08-03

SpringBoot接口参数接收指南:从URL到请求体,4种方式一次掌握

08-03

Java集合框架常用API有哪些?List、Set、Map方法大全

08-03

SpringBoot拦截器怎么用?从入门到多拦截器链式调用详解

08-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论