インタビュアーの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
著作権:記事で再現は明らかに作者とソースの位置を示しています。