この記事の内容は、Java の "abc" と新しい文字列 ("abc") の違いについてです。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。
Java エンジニアの面接官が好む質問の 1 つは、「abc」と新しい文字列 (「abc」) の違いは何ですか?というものです。より良い答えは、Java ヒープ、スタック、定数プール、参照などの概念を明らかにします。しかし今日はそれだけではなく、この問題を指示の観点から見てみましょう。
本文
Java クラスのコンパイルされたバイトコードはバイナリ ファイルであり、人間ではなくマシンが読み取ることができることがわかっています。しかし、Java には javap 命令があり、バイトコードを人間が理解できるものに変換できます。
javap は、逆コンパイル (つまり、javac によってコンパイルされたファイルの逆コンパイル) ができる Java クラス ファイル分解ツールであり、Java コンパイラによって生成されたバイトコードを表示することもできます。クラスファイルを分解するために使用されます。
次のように定義されたクラスができました。
public class A01 { public static void main(String ... args){ String a = "123"; String c = new String("123"); } }
まず javac A01.java を使用してバイトコードにコンパイルし、次に javap -c A01.class を使用して逆コンパイルします。次のテキストを取得します
Compiled from "A01.java" public class javap.A01 { public javap.A01(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String...); Code: 0: ldc #2 // String 123 2: astore_1 3: new #3 // class java/lang/String 6: dup 7: ldc #2 // String 123 9: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V 12: astore_2 13: return }</init></init>
主に main メソッドに関する次のテキストを確認します。関係する命令はそれほど多くありません。整理しました。
ldc: 定常光をオペランド スタックにロードします。
astore_1: スタックの最上位要素の値を変数 1 に保存します。
new: 作成するクラス インスタンス用にメモリ空間を開き、アドレスをオペランド スタックにプッシュします。
dup:オペランド スタックの最上位の値、そしてそれをスタックの最上位にプッシュします。
invokespecial: メソッドを呼び出します。例のメソッドはクラスのコンストラクターです。
次に、命令とオペランド スタックを結合します。計算をシミュレートするには
元の質問に戻ります。a=new String("123") と a=new String("123") の違いです。前者はアドレスを指します。定数プールの、後者はヒープで開かれたアドレス内の新しいアドレスを指します。これら 2 つの == の結果は当然等しくありません。等しい場合の結果はどうなるでしょうか?等しい は、内容を 1 文字ずつ比較し、等しいです。
この記事はここで終了しています。その他のエキサイティングなコンテンツについては、PHP 中国語 Web サイトの Java チュートリアル ビデオ 列に注目してください。
以上がJava の "abc" と new String("abc") の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。