gpt4 book ai didi

java - 尝试创建字符串

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:12 25 4
gpt4 key购买 nike

我在测试字符串创建和检查哈希码时发现了一个有趣的案例。

在第一种情况下,我使用复制构造函数创建了字符串:

public class Test {

/**
* @param args
*/
public static void main(String[] args) {

String s1 = new String("myTestString");

String s3 = s1.intern();

System.out.println("S1: " + System.identityHashCode(s1) + " S3:"
+ System.identityHashCode(s3));
}


}

上面代码的输出是:

S1: 816115710 S3:478684581

这是预期的输出,因为驻留字符串从字符串池中选择引用,而 s1 选择新对象的引用。所以他们的身份哈希码是不同的。

现在,如果我使用 char 数组创建 String,那么我会看到一些奇怪的行为:

public class Test {

/**
* @param args
*/
public static void main(String[] args) {

char[] c1 = { 'm', 'y', 'T', 'e', 's', 't', 'S', 't', 'r', 'i', 'n',
'g' };

String s5 = new String(c1);

String s6 = s5.intern();

System.out.println("S5: " + System.identityHashCode(s5) + " S6:"
+ System.identityHashCode(s6));
}

}

上面代码的输出是:

S5: 816115710 S6:816115710

这是意外的输出。 interned String 和 new String 对象如何具有相同的 identityhashcode??

有什么想法吗?

最佳答案

在第一种情况下,myTestString 文字在您调用 intern 之前 位于池中,而在第二种情况下则不然你的字符串 s5 直接放入池中。

如果我们一步一步地看你的例子,会发生这样的事情:

  • String s1 = new String("myTestString"); => 使用字符串文字在池中创建一个字符串 myTestString(我们称它为 s0),并且还创建了一个新的字符串s1,它不在池中。
  • String s3 = s1.intern(); => 检查池中是否有等效的字符串并找到 s0。现在 s3s0 指的是同一个实例(即 s3 == s0 为真,但是 s1 != s0).

在你的第二个例子中:

  • String s5 = new String(c1); 创建一个不在池中的新字符串
  • String s6 = s5.intern(); 检查 myTestString 是否在池中但找不到它,因此调用 intern 在池中创建一个新的字符串 reference,它引用与 s5 相同的字符串。所以 s6 == s5 为真。

最后你可以运行这两个程序来证实我的解释(第二个打印 true 三次):

public static void main(String[] args) {
String s1 = new String("myTestString");
String s3 = s1.intern();
System.out.println("myTestString" == s1);
System.out.println(s3 == s1);
System.out.println("myTestString" == s3);
}

public static void main(String[] args) {
String s1 = new String(new char[] {'m', 'y', 'T', 'e', 's', 't', 'S', 't', 'r', 'i', 'n', 'g'});
String s3 = s1.intern();
System.out.println("myTestString" == s3);
System.out.println("myTestString" == s1);
System.out.println(s3 == s1);
}

关于java - 尝试创建字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16633195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com