gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:21:11 25 4
gpt4 key购买 nike

我有以下几行代码来比较字符串。 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 执行的输出。它本质上是 VM 中的一种优化,以避免在每次声明文字时创建一个新的字符串对象,这可能会很快变得非常昂贵!在您的 str1==str2 示例中,您明确告诉 VM 创建新的字符串对象,因此它是错误的。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com