使用“==”运算符比较字符串时出现的问题 (Java 11) [duplicate]

Problems when comparing Strings using the "==" operator (Java 11) [duplicate]

提问人:ko-hs 提问时间:8/24/2023 更新时间:8/24/2023 访问量:81

问:

我是 Java 的新手。现在我正在研究带有 String 的“==”运算符。

我知道在 java 中,字符串文字存储在堆区域的字符串池中,以实现不可变性和节省内存。而且我知道,如果我使用“new”关键字,它将存储在堆区域中,而不是字符串池中。

在下面的代码中,case_1、case_2 case_3都返回相同的字符串文字。所以我希望一切都能打印出来。但就case_1而言,它打印了假的。

我的问题是:

  • 由于 case_1、2 和 3 都返回相同的字符串文字,因此它们都指向字符串池中的相同地址,因此它应该输出 true,但为什么它为 case_1 输出 false?

如果可能,请参考堆中的字符串池来回答。

谢谢!

public class Main {
    public static void main(String[] args) {
        MyString ms = new MyString();

        String str1 = ms.getString1(10);
        String str11 = ms.getString1(10);

        String str2 = ms.getString2();
        String str22 = ms.getString2();

        String str3 = 10 + "";
        String str33 = 10 + "";

        System.out.println(str1 == str11); // case_1
        System.out.println(str2 == str22); // case_2
        System.out.println(str3 == str33); // case_3
    }
}

class MyString {
    String getString1(int n) {
        return n + "";
    }

    String getString2() {
        return 10 + "";
    }
}

我期望以下几点

true
true
true

但实际输出是这样的

false
true
true
字符串 java-11 string-comparison

评论

0赞 Ted Klein Bergman 8/24/2023
@MadProgrammer 链接的问题不是重复的。我建议重新打开它。
0赞 MadProgrammer 8/24/2023
@TedKleinBergman 随意重新投票
0赞 Ted Klein Bergman 8/24/2023
@MadProgrammer我不能再投一个;我之前已经为这个问题投了一个,因为它被关闭为与同一问题重复。
1赞 Holger 8/24/2023
您了解术语“字符串文字”的含义吗?您的任何方法都不会返回字符串文本。代码中只有一个字符串文字 (),但没有语句。字符串文字既不是,也不是。""return "";n + ""10 + ""
1赞 Holger 8/24/2023
字符串文字是源代码的语法结构。Only 是字符串文本。相反,是一个表达式,但其值是编译时常量。因此,两者 和 都是具有相同值的编译时常量,因此可以保证在运行时引用同一对象。源代码形式无关紧要,换句话说,它不需要是字符串文字。它必须是规范的这一部分中指定的编译时常量"10"10 + """10"10 + ""String

答:

1赞 Ted Klein Bergman 8/24/2023 #1

字符串池用于编译时已知的字符串。案例 2 和 3 是已知的。

情况 2 始终返回字符串 ,因此可以将其保留。 情况 3 始终存储字符串 ,因此可以将其保留。10 + ""10 + ""

但是,情况 1 返回 n 可以是任何值。对于编译器来说,存储 n 的所有值的所有可能的字符串是没有意义的。因此,它存储在堆中。n + ""

即使在这个简单的情况下,我们也知道情况 1 也是如此,但是遍历程序中的所有函数以尝试预先计算字符串会有点复杂。10 + ""

评论

0赞 Jean-Baptiste Yunès 9/1/2023
您可以在第一种情况下添加 use of 以确保字符串是相同的对象。.intern()getString(...).intern()