Javaにおける2つの文字列の初期化方法の違い
2893 ワード
Javaにおける2つの文字列の初期化方法の違い両文とも1つのStringオブジェクトを返す参照であるが、jvmは両者の処理方法が異なる.1つ目はjvmはすぐにheapに(ヒープ)でStringオブジェクトを作成し、そのオブジェクトの参照をユーザーに返します.2つ目の場合、jvmはまず内部メンテナンスstrings poolでStringのequelsメソッドを使用して、オブジェクトプールにStringオブジェクトが格納されているかどうかを検索します.ある場合は、heapで新しいStringオブジェクトを再作成することなく、既存のStringオブジェクトをユーザーに返します.オブジェクトプールにStringオブジェクトがない場合、jvmはheapに新しいStringオブジェクトを作成し、その参照をユーザーに返し、strings poolに追加します.注意:最初の方法でオブジェクトを作成する場合、jvmはプログラムがStringのinternメソッドを呼び出さない限り、strings poolにオブジェクトを自動的に配置しません.次の例を見てください:
リファレンスを作成するときは、同じ新しいオブジェクトに接続することを望んでいます.通常newキーワードでこの目的を達成します.newは「私をこれらの対象の新しいタイプに変えた」という意味です.上記の例では、
String str1 = new String("abc");
String str2 = "abc";
String str1 = new String("abc"); //jvm String
String str2 = “abc”; //jvm strings pool “abc” ,
String , strings pool String
if(str1 == str2){
System.out.println("str1 == str2");
}else{
System.out.println("str1 != str2");
}
// str1 != str2,
String str3 = "abc";
// ,jvm strings pool “abc” , “abc”equels “abc”
// str2 str3, str2 str3
if(str2 == str3){
System.out.println("str2 == str3");
}else{
System.out.println("str2 != str3");
}
// str2 == str3
リファレンスを作成するときは、同じ新しいオブジェクトに接続することを望んでいます.通常newキーワードでこの目的を達成します.newは「私をこれらの対象の新しいタイプに変えた」という意味です.上記の例では、
String s = new String("asdf");
“ ”, , “ ”。
, (String) 。 Java , , 。 , Java 。