java - 是什么让引用比较 (==) 对 Java 中的某些字符串起作用?

标签 java string equals

我有以下几行代码来比较字符串。 str1 不等于 str2,这是可以理解的,因为它比较对象引用。但为什么s1等于s2呢?

String s1 = "abc";
String s2 = "abc";
    
String str1 = new String("abc");
String str2 = new String("abc");
    
if (s1==s2)
    System.out.println("s1==s2");           
else
    System.out.println("s1!=s2");
    
if (str1==str2)
    System.out.println("str1==str2");           
else
    System.out.println("str1!=str2");
    
if (s1==str1)
    System.out.println("str1==s1");         
else
    System.out.println("str1!=s1");

输出:

  s1==s2
  str1!=str2
  str1!=s1

最佳答案

字符串常量池本质上会缓存所有字符串文字,因此它们在下面是同一个对象,这就是为什么您会看到 s1==s2 的输出。它本质上是虚拟机中的一种优化,以避免每次声明文字时创建一个新的字符串对象,这可能很快就会变得非常昂贵!在您的 str1==str2 示例中,您明确告诉虚拟机创建新的字符串对象,因此它是错误的。

顺便说一句,对任何字符串调用 intern() 方法都会将其添加到常量池中,只要等效字符串尚不存在(并返回它添加的字符串)到池中。)但是,除非您确定正在处理肯定会用作常量的字符串,否则这样做不一定是个好主意,否则您最终可能会很难追踪内存泄漏。

关于java - 是什么让引用比较 (==) 对 Java 中的某些字符串起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56635641/

相关文章:

java - 正则表达式删除字母

c# - Hashtable A 等于 HashtAble B 控件

java - 使用比较器聚合相似的对象,而不与 equals() 保持一致

java - 如果对象存在于 arraylist 中则增加计数,否则将对象添加到 arraylist

java - 如何构建一个像二进制文件一样的 google-chrome 包装脚本?

java - 静态变量是否继承

javascript - 如何按范围替换字符串?

swift - iOS - 将字符串转换为 double

java - 在 Spring AOP 或 AspectJ 中拦截带注释的类和方法

java - 当只有类型很重要时,在 JPA 中保留成员变量