为这个问题做例子
我注意到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)
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)