有关Java字符串的问题

时间:2018-08-05 21:48:22

标签: java string equals

(是或否)假设字符串对象b和c包含相同的字符序列。那么b == c是真的。

public static void main(String[] args) {
    String a = "abc";
    String b = "abc";

    System.out.println(a == b);
    System.out.println(a.equals(b));
}

结果为true,但问题的答案为false。我想知道为什么。

2 个答案:

答案 0 :(得分:4)

public static void main(String[] args) {
    String a = new String("abc");
    String b = new String("abc");

    System.out.println(a.equals(b));
    System.out.println(a == b);
}

先打印true,然后再打印false。因此,两个具有相同字符序列的字符串必须彼此equal,但彼此可以==

很明显,a == a在所有情况下都是有效的,并且aString,包含与a相同的字符序列。

但是在上面的示例中,我们正在创建两个不同的实例,它们恰好包含相同的字符序列。因此a != b

那么您的示例中发生了什么? String interning

编译器会在特殊的池中分配任何字符串文字,并且任何重复的文字都共享相同的引用。因此,即使字面量定义了两次,就编译器而言,它们都是相同的实例。

答案 1 :(得分:3)

测试结果为true的原因是JVM喜欢做的一件很奇怪的事情。因为您已经定义了两个String文字,所以JVM只会决定存储这些值之一,并且a和b都引用相同的字符串。这就是为什么在==中进行true比较的原因。

正如其他人所说,执行String b = new String("abc");将强制生成新的String文字,这将是一个单独的内存块。因此,==比较将得出false