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

时间:2012-09-05 06:32:21

标签: java string

  

可能重复:
  intern() behaving differently in Java 6 and Java 7

this question

做示例

当我在intern()上调用intern()方法后,我注意到了String方法的一种奇怪行为我可以使用==运算符来获取原始字符串

intern()方法的JavaDoc:

  

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

     

当调用intern方法时,如果池已经包含与equals(Object)方法确定的此String对象相等的字符串,则返回池中的字符串。否则,将此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");
        }
    }
}

3 个答案:

答案 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