String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = new String("a");
String str5 = new String("b");
String str6= new String("ab");
String plus1 = str1 + str2;
String plus2 = str1 + "b";
String plus3 = str4 + "b";
String plus4 = "a" + "b";
String plus5 = str4 + str5;
String plus6 = str4 + str2;
string相加有上面的6种情况
我想弄清楚各种情况的区别,我知道的是plus4都是在栈区,所以结果是一个字符串常量池里的常量,但是其他情况呢?
另外,我打印plus1~plus6的地址或者hashcode,发现都是一样的,怎么回事?
1階の答えは一般的すぎるため、JVMとJDKのバージョンに関係なくメモリ割り当てについて話すのは単なる不正です。
質問を例として挙げてみましょう:
リーリーこの種の文字列の直接定義では、この種の文字列はメソッド領域の定数プールに直接割り当てられるため、JVM は文字列を不変条件、つまりスレッドセーフであるとみなします。
リーリーこの文字列がヒープに割り当てられていることを示す新しいキーワードがあります。次の方法を使用して確認できます。 リーリー
plus1~6のハッシュコードが同じである理由を答えてください。 Stringのハッシュコードメソッドを書き換えていないからです。文字列のデフォルトのハッシュコードの実装は次のとおりです:リーリー
リテラル定数のみを処理しており、plus1~6のリテラル定数は同じなので、ハッシュコードの値も当然同じです。この場合、ハッシュコードは一貫していますが、jvm 内でそれらによって割り当てられたメモリ アドレスが一貫していることを意味するわけではありません。メモリ内には同じ文字列のインスタンスが 1 つだけあります
---------------------------------区切り線-------------- --
この回答は一般的すぎて誤解を招きます。Zhenyi 兄弟の回答を参照してください。
上の人は正しい、同じ文字列リテラルはメソッド領域に1つの値しか持たない。これは、string と stringbuffer の使用上の一般的な違いです。
以下に追加します:
String str4 = new String("a");
"a" リテラルは、JVM のメソッド領域に格納されます。
str4 このオブジェクトはヒープに格納されます。
上記の文は、2つのメモリアドレスが割り当てられることを意味します。
スタックには 8 つの基本型が格納され、returnAddress と Reference はスタックに格納されません。
ハッシュコードの用途としては、マッチングと位置決めに使用されます。自分で Baidu にアクセスして、ハッシュコードと == および等しいの違いを調べることができます。
また、plus1~6のメモリアドレスも明らかに違います。どうして同じだとわかったのかわかりません。 。 。
よくわからないところがありましたら、アドバイスをお願いします。