1

オブジェクト指向の文脈におけるオブジェクトアイデンティティに関する記事を読んだことがあります。しかし、以下のコードで混乱しました。

     String str="Hello";
     String str1="Hello";
     System.out.println(str.hashCode()); //69609650
     System.out.println(str1.hashCode()); //69609650
     System.out.println(System.identityHashCode(str));//19313225
     System.out.println(System.identityHashCode(str1));//19313225

str と str1 の両方のハッシュ コードと identityhashcode は同じです。間違って理解した場合は修正してください。

また、 hashcode() と system.identityhashcode() の違いは何ですか

4

6 に答える 6

1

宣言する場合は注意してください

文字列 s2 = 新しい文字列("こんにちは")
System.identityHashCode(s2);
異なるハッシュコードを返します。これは、宣言が次のようになっているためです
文字列 s = "何か"
、jvm は文字列プールをチェックして、同一のリテラルがあるかどうかを調べます。宣言が好きなとき
String s = new String("何か");
jvm は常に新しいオブジェクトを作成します。

于 2013-09-17T10:19:47.537 に答える
0

オブジェクトは両方ともインターンされた文字列定数です。JVM は、それらが同じオブジェクトであることを保証します。

hashCode と identityHashCode の違いは、hashCode が文字列オブジェクトの値のハッシュであるのに対し、identityHashCode はibjectの内部識別子のハッシュであることです。

于 2013-09-17T10:47:20.607 に答える
0

ドキュメント ( http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode(java.lang.Object) ) に記載されているように、identityHashCode は同じ HashCode を提供します。 hashCode メソッドがオーバーライドされたわけではありません。

于 2013-09-17T10:12:55.850 に答える
0

String オブジェクトを使用していません。String リテラルを使用しています。それらの間には非常に大きな違いがあります。あなたの場合、 str と str1 はどちらも String プール内の同じ "Hello" オブジェクトを指しています。このようなことをしてみてください:

StringBuilder sb1= new StringBuilder("Hello");
StringBuilder sb2= new StringBuilder("Hello");
System.out.println(sb1.hashCode()); 
System.out.println(sb2.hashCode()); 
System.out.println(System.identityHashCode(sb1));
System.out.println(System.identityHashCode(sb2));

出力: 7214088 15020296 7214088 15020296

StringBuilder が新しいオブジェクトを作成すると、sb1 と sb2 の hashCode が異なることがわかります。つまり、それらは同じオブジェクトを指していません。しかし、str1 と str2 は同じ String オブジェクトを指しています。詳細については、文字列プールと permgen スペースに関する記事をお読みください。

于 2013-09-17T11:15:23.223 に答える