JAVAの顔質問のString =新しい文字列( "XYZ");複数のオブジェクトを生成?

インタビュアーのQ1:ウィルのString =新しい文字列(「XYZ」)は、複数のオブジェクトを生成しますか?

このJava面接の質問については、コードの古いルーチンの最初:

StringTest {クラス公開
    パブリック静的無効メイン(文字列[] args){ 
        ストリングS1 = "こんにちは"; 
        ストリングS2 = "こんにちは"; 
        文字列S3 =新しい新しい文字列( "こんにちは"); 
        のSystem.out.println(「S1およびS2参照アドレスが同じである: "+(S1 == S2)); 
        のSystem.out.println(" S1、S2が同じ値である"+ s1.equals(S2)); 
        のSystem.out.println("参考文献S1及びS3アドレスは同じである: "+(S1 == S3)); 
        のSystem.out.println(" S1及びS3が同じ値である「+ s1.equals(S3)); 
    } 
}

次のように印刷結果は以下のとおりです。

S1とS2の参照アドレスは同じです:真
S1とS2と同じ値です:真の
S1とS3参照アドレスは同じです:falseに
S1とS3と同じ値です:真

上記のプログラム、「==」は、2つのオブジェクト参照が同じに対処するかどうかの決意であるが、同一の物体か否かを判断し、真S1とS3にS1およびS2に戻り、FALSEを返しています。二つの基準の同じオブジェクト参照アドレス、S3の説明S1及びS2は、他のオブジェクトと同じアドレスではありません。

JavaのStringオブジェクトの数が多いを避けるために、我々は、文字列定数プールを設計しました。このように動作します、いない場合は、文字列を作成するときに、JVMは最初の文字列定数プール文字列と等しい値があるかどうかをチェックし、もはや存在する場合、直接バック文字列のアドレスを参照すると、作成されていません作成し、文字列定数プールに、新しく作成された文字列のアドレスへの参照を返します。したがって、上記s1とs2と同じアドレスを参照します。

なぜ、S3およびS1、S2引用符で囲まれた文字列が同じアドレスではないでしょうか?文字列S3 =新しい文字列(「こんにちは」); JVMが最初の文字列定数プールに「こんにちは」の文字列を見つけることです、あなたが文字列定数を作成し、その後、一定のプールにしていない場合は、すでに存在する場合は、あなたが作成する必要はありません。新しいに直面したとき、だけでなく、メモリ(ではないが、ヒープ内の文字列定数プール)ので、S3、新しい文字列オブジェクトストレージ「こんにちは」リターンアドレスとメモリ参照で、文字列オブジェクトの作成時に、中そして、S1、S2参照文字列が同じアドレスではありません。次のようにメモリ構造は次のようになります。

 

ヒープのアドレスに点S1とS2、図メモリから見た定数プール内の文字列定数を向けられ、それらはメモリ・アドレスと比較され、およびS3、ヒープの特定点がなければなりませんエデン領域、S2とS3、S3とS1の比較は、アドレスが同じではない、等しくありません。

 

Stringクラスの動作原理を理解し、質問自体に戻ります。

作品のString、それが言及された、新しいStringオブジェクトは、その後、メモリ内のStringオブジェクトを作成し、その文字列str =新しい文字列をリテラル文字列に同じ値を見つけるか、定数文字列を作成する必要があります( "XYZ"); 2つのオブジェクトを作成します。

 

以下の2つのJava面接の質問は、メッセージ領域応答ヨーヨーに入れることができます。

文字列STR1 =新しい文字列( " " + "B"); ?作成されるオブジェクトの数
の文字列str2を=新しい新しいString( "ABC")+ "ABC";どのように多くのオブジェクトを作成することでしょうか?

 

著者:Javaのアリ

出典:https://www.cnblogs.com/marsitman/p/11248001.html

著作権:記事で再現は明らかに作者とソースの位置を示しています。   

おすすめ

転載: www.cnblogs.com/marsitman/p/11248001.html