为什么比较内容相同的String字符串会得到不同的结果?
Java字符串比较结果差异原因
首先明确两个比较操作的核心区别:
==对于引用类型(包括String),比较的是两个引用指向的内存地址是否相同,本质是判断是否为同一个对象equals()方法在String类中被重写,专门用于比较两个字符串的实际字符内容是否完全一致,和对象地址无关
再结合JVM的字符串常量池机制解释你的代码结果:
- 当你用
String s1 = "Hello"、String s2 = "Hello"这种双引号直接赋值的方式声明字符串时,JVM会优先在字符串常量池中查找是否存在值为"Hello"的对象:- 首次声明s1时,常量池没有对应对象,会新建后返回引用给s1
- 声明s2时,常量池已经有"Hello",直接把同一个引用返回给s2
因此s1和s2指向同一个对象,s1 == s2返回true,同时两者内容完全相同,s1.equals(s2)必然返回true,你给出的运行结果中这行显示为false属于笔误。
- 当你用
String s3 = new String("Hello")声明字符串时,相当于强制JVM在堆内存中开辟一块新的独立空间存储String对象,不会复用常量池中的已有对象,因此s3的内存地址和s1完全不同,所以s1 == s3返回false,但两者存储的字符内容一致,所以s1.equals(s3)返回true。
最佳实践:如果只需要判断字符串内容是否相同,统一使用equals()方法,不要用==,避免因为对象来源不同出现不符合预期的结果。
内容的提问来源于stack exchange,提问作者disamaj964
相关产品推荐
相关产品推荐

