文字列の作成をテストし、ハッシュコードをチェックしているときに、興味深いケースを見つけました。
最初のケースでは、コピー コンストラクターを使用して文字列を作成しました。
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 は新しいオブジェクトの参照を選択するため、予想される出力です。したがって、それらの ID ハッシュ コードは異なります。
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
これは予期しない出力です。インターンされた文字列と新しい文字列オブジェクトが同じアイデンティティハッシュコードを持つにはどうすればよいですか??
何か案は?