Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.intern()是否更改原始字符串JDK7的引用_Java_String - Fatal编程技术网

Java String.intern()是否更改原始字符串JDK7的引用

Java String.intern()是否更改原始字符串JDK7的引用,java,string,Java,String,可能重复: 在做例子的时候 当我在String上调用intern()方法时,我注意到intern()方法有一种奇怪的行为,此后我可以对原始字符串使用=操作符 intern()的JavaDoc方法: 返回字符串对象的规范表示形式。 最初为空的字符串池由类字符串私下维护 调用intern方法时,如果池中已包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用 因此,对于任何两个字符串s和t,s.

可能重复:

在做例子的时候

当我在
String
上调用
intern()
方法时,我注意到
intern()
方法有一种奇怪的行为,此后我可以对原始字符串使用
=
操作符

intern()的JavaDoc
方法:

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

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

因此,对于任何两个字符串
s
t
s.intern()==t.intern()
为真,当且仅当
s.equals(t)
为真

上面的Javadoc并没有说原始字符串被更改。那么,当输入
test
时,为什么该程序会打印
ok

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");
        }
    }
}

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

在下面的行中提供输入表单用户

    username = user_input.next();
然后调用
username.intern()
返回
用户名的字符串文本

现在在你的条件声明中

if (username == "test") 
变量
username
包含字符串池中的字符串文本对象,并且
“test”
也是一个字符串文本,因此jvm将为您提供已为
username
创建的字符串
test
的相同引用 这意味着
用户名
测试“
是同一个对象。 在java中,
=
检查对象的引用,这样在本例中它将返回
true
这就是为什么它会打印
OK
字符串。intern()返回intern()ed字符串。这是因为方法无法更改传递给它的引用

那么,为什么这个程序在输入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");
        }
    }
}
它可以打印,因为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"));
在本例中,Java7更新7中的输出是

String object the same is: test
但是,在Java6Update32上运行这个命令,或者取消注释该行,以便首先看到“test”,然后得到

String object the same is: false

intern()
调用不应该影响下面测试的结果。@JoachimSauer有趣的是,确实如此。刚刚用最新的Java7试过。用Java6试过,结果显示“不好”。@ThomasJungblut:事实上,我也用Java7验证过(Java6按预期显示“不好”)。一种可能的解释是Java 7延迟构建常量池,这可能导致使用用户提供的
“test”
字符串实例有效地进行代码中的
测试。注释也注意到了这里描述的效果,但没有进一步讨论。这是正确的,但是返回的引用应该是池字符串。它不应更改方法内的引用。但它正在更改原始字符串引用。我使用的是JDK7。你所建议的在Java中对于任何方法都是不可能的,所以,不,它不是。@AmitD添加了一个示例来演示这种差异。更改的是字符串文字,而不是您的
username
String.Yes。这是正确的理由。谢谢。我假设(除了注释中链接的RFE和重复的候选者)Java7中的一个变化是字符串文本现在被(更)惰性地搜索/实例化。我的印象是Java在加载时加载了类的所有相关字符串文本('尽管我没有对此的引用)。