在测试字符串创建和检查其哈希码时,我发现了一个有趣的案例。
在第一种情况下,我使用复制构造函数创建了字符串:
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 数组创建字符串,那么我会看到一些奇怪的行为:
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
这是一个意外的输出。实习字符串和新字符串对象如何具有相同的身份哈希码?
有任何想法吗?