5

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

在为这个问题做例子时

intern()当我调用intern()方法时,我注意到方法的一种奇怪行为,String此后我可以将==运算符用于Original String

方法的JavaDoc intern()

返回字符串对象的规范表示。一个字符串池,最初是空的,由 String 类私下维护。

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

由此可见,对于任何两个字符串sts.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");
        }
    }
}
4

3 回答 3

3

String.intern() 返回 intern()ed 字符串。这是因为方法不能更改传递给它的引用。

那么为什么当 test 是输入时这个程序打印正常。

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

试试吧。

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 update 32 上运行它或取消注释该行,以便首先看到“测试”并且你得到。

String object the same is: false
于 2012-09-05T07:21:55.963 回答
2

str.intern() 检查字符串池中是否已经存在相同的对象,如果是,则重用它。

于 2012-09-05T06:37:06.010 回答
0

下面的行为您提供输入表单用户。

    username = user_input.next();

之后,您将调用它 在条件语句 username.intern();中返回 Now 的字符串文字username

if (username == "test") 

您的变量username包含来自字符串池的字符串文字对象,并且"test"也是字符串文字,因此 jvm 将为您提供相同的字符串引用,test该引用已经为此创建username 并且username"test"相同的对象。并且在 java 中==操作了对象的检查引用,所以在这种情况下,它会返回true 这就是它打印的原因 okay

于 2012-09-05T06:57:11.983 回答