Javaにおける2つの文字列の初期化方法の違い

2893 ワード

Javaにおける2つの文字列の初期化方法の違い
    String str1 = new String("abc");     
      String str2 = "abc";
  • 両文とも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にオブジェクトを自動的に配置しません.次の例を見てください:
  •  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           。