String.intern()是否更改Original String JDK7的引用

Ami*_*nde 5 java string

可能重复:
intern()在Java 6和Java 7中的行为方式不同

为这个问题做例子

我注意到intern()方法的一个奇怪的行为,当我调用intern()方法String后,我可以使用==运算符的原始字符串.

JavaDoc的intern()方法:

返回字符串对象的规范表示.最初为空的字符串池由String类私有维护.

当调用intern方法时,如果池已经包含与该equals(Object)方法确定的String对象相等的字符串,则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.

它遵循对于任何两个字符串s和t,s.intern() == t.intern()为真,当且仅当s.equals(t)是真实的.

上面的Javadoc并没有说原始字符串会发生变化.那么为什么这个程序打印okay时test输入.

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner user_input = new Scanner(System.in);
        String username;
        System.out.print("username: ");
        username = user_input.next();
        // Even if I do not assign returned string for comparison still it compares
        // okay else it does not compare
        username.intern();
        if (username == "test") {
            System.out.println("okay");
        }
        else {
            System.out.println("not okay");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 3

String.intern() 返回经过 intern() 处理的字符串。这是因为方法无法更改传递给它的引用。

那么为什么当输入为 test 时该程序打印正常呢?

它打印得很好,因为 intern()ed 字符串是第一次看到这个字符串,所以它成为“test”的一个字符串文字。改变的不是字符串,而是用于“测试”的对象。

尝试一下。

String te = "te", st = "st";
// "test".length();
String username = te + st;
username.intern();
System.out.println("String object the same is: "+ (username == "test"));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Java 7 update 7 中的输出是

String object the same is: test
Run Code Online (Sandbox Code Playgroud)

但在 Java 6 update 32 上运行它或取消注释该行,以便首先看到“test”,然后您就可以得到。

String object the same is: false
Run Code Online (Sandbox Code Playgroud)