字符串池的意外行为

Pom*_*rio 1 java string-comparison

我有以下测试:

public class EqualityTest
{
    String one = new String("Hello world");
    String two = new String("Hello ") + new String("world");

    @Test
    public void testStringPool()
    {
        assertFalse(one == two); // FALSE!!!
        assertTrue(one.equals(two));
        assertTrue(one.intern().equals(two.intern()));
    }
}
Run Code Online (Sandbox Code Playgroud)

我原以为由于Java的字符串池特性,VM会分配一个和两个指向池中相同的字符串.在这种情况下,为什么我的理解错了?

Jon*_*eet 10

我原以为由于Java的字符串池特性,VM会分配一个和两个指向池中相同的字符串.

只有字符串常量会自动实现.所以如果你的代码是:

String one = "Hello world";
String two = "Hello " + "world";
Run Code Online (Sandbox Code Playgroud)

......然后onetwo将有同样的价值.因为您已经使用过new String(...),所以这些表达式不是常量表达式,因此它们不会被实现.(当然,文字仍然是实习的......但不是文字创建的字符串.)

有关什么算作常量表达式的详细信息,请参见JLS的第15.28节.