做示例
当我在intern()
上调用intern()
方法后,我注意到了String
方法的一种奇怪行为我可以使用==
运算符来获取原始字符串
intern()
方法的JavaDoc:
返回字符串对象的规范表示。 最初为空的字符串池由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");
}
}
}
答案 0 :(得分:3)
String.intern()返回intern()ed String。这是因为方法无法更改传递给它的引用。
所以当测试是输入时,为什么这个程序打印好。
它打印正常,因为intern()ed字符串是第一次看到这个String,所以它成为“test”的一个字符串文字。它不是被更改的字符串,而是用于“测试”的对象,它被更改。
尝试改为。
String te = "te", st = "st";
// "test".length();
String username = te + st;
username.intern();
System.out.println("String object the same is: "+ (username == "test"));
在这种情况下,Java 7 update 7中的输出是
String object the same is: test
但是在Java 6更新32上运行它或取消注释该行,因此首先看到“test”,然后你就可以了。
String object the same is: false
答案 1 :(得分:2)
str.intern()检查字符串池中是否已存在相同的对象,如果是,则重新使用它。
答案 2 :(得分:0)
下面的行为您提供输入表单用户。
username = user_input.next();
之后,您正在调用username.intern();
,它返回username
的字符串文字
现在在您的条件声明中
if (username == "test")
你的变量username
包含来自字符串池的String文字对象,而"test"
也是一个字符串文字,所以jvm将为你提供已经创建的字符串test
的相同引用username
这意味着username
和"test"
是同一个对象。
并且在java ==
中操作了对象的检查引用,因此在这种情况下它将返回true
这就是为什么它的打印okay