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

问题描述 投票:0回答:1

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

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

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

我的问题是:

  • 由于case_1、2、3都返回相同的字符串文字,所以它们都指向字符串池中的同一个地址,所以应该输出true,但是为什么case_1却输出false呢?

如果可以的话,请参考Heap中的String池来回答。

谢谢!

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 string java-11 string-comparison
1个回答
0
投票

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

情况 2 始终返回字符串

10 + ""
,因此可以对其进行实习。 情况 3 始终存储字符串
10 + ""
,因此可以将其保留。

情况 1 然而,返回

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

即使在这个简单的情况下,我们知道情况 1 也是

10 + ""
,但是检查程序中的所有函数来尝试预先计算字符串会有点复杂。

© www.soinside.com 2019 - 2024. All rights reserved.