javaで==で比較する場合、メモリ上のアドレスを比較することになります。 新しい文字列以外の文字列は、文字列定数プールにあります。文字列定数プールはメソッド領域にあり、jdk 1.7以下ではヒープから分離されています。文字列定数プールで文字列を生成する新しい方法でない場合は、文字列定数プールで文字列がすでに存在するかどうかをチェックし、存在する場合は生成を繰り返しません。例えば、2つの "helloworld "文字列を新規でない方法で生成し、aとbで指し示し、= =で比較すると、結果はtrueになります。
この図はどのように説明しているのですか? eもまた新しい方法ではない方法で生成されているのではありませんか? 答えはeが新しい方法で生成されたからです。このとき、生徒の中には「私が盲目だとでも? 新しくないでしょ? それなら心配しないで、私の詳しい説明を聞いてください。
何度も、自分のコードの最適化でJavaプログラマは、実際には、コンパイラもあなたのコードの最適化で、あなたはd + "世界 "と思う呼び出しの仮想マシンは、それをスプライシングするための方法ですか?このプロセスでは、バイトコードにソースコードからコンパイラによってJavaのソースコードを知って、コンパイラは多くの作業を行っている、私は大学でコンパイルの原則を学んだあなたのすべてが認識していると信じています。JVMは、"バイトコード "を参照していくつかの命令を提供することができ、つまり、仮想マシンは、この行の実行では、何が行われますか?
javap The Java Class File Disassembler -c You use the javap command to disassemble one or more class files -verbise: Prints stack size, number of locals and args for methods.
javap -cはバイトコードを逆アセンブルします。 javap -verboseは-cよりもさらに進んで、スタック・サイズとメソッド・パラメータを表示します。
この命令について、ある人はデコンパイルと呼び、ある人は逆アセンブルと呼びます。まず、デコンパイルと逆アセンブルの違いを説明し、どちらが適切かをお話ししましょう。デコンパイル: 高級言語のソースプログラムをコンパイルして実行ファイルにすることで、逆プロセスがデコンパイルです。逆アセンブル: 逆アセンブル:アセンブリコードプロセスへのターゲットコードは、また、アセンブリ言語コードに機械語であると言うことができる逆アセンブルと逆アセンブルは、この観点から、より適切なデコンパイルのこの命令を呼び出します。
Javaのバイトコードは機械語? 機械語とはどういう意味ですか? コンピュータが直接認識できるプログラミング言語? この定義はまだ大雑把です。
機械語は命令セットのシステムです。この命令セットはマシンコードと呼ばれ、コンピュータのCPUが直接解釈できるデータです。マシン・コードはネイティブ・コードと呼ばれることもありますが、これは特定のプログラミング言語やライブラリが実行されるプラットフォームに関連する部分に重点を置いた用語です。機械語は、コンピュータが直接認識して実行できるバイナリコードで表現された機械命令の集まりです。コンピュータのハードウェア構造を通じて、設計者がコンピュータに与えた操作機能です。機械語には、柔軟性、直接実行、速度という特徴があります。異なる種類のコンピュータは互換性のない機械語を持ち、ある種類のコンピュータの機械命令で書かれたプログラムは別の種類のコンピュータでは実行できない - Wikipedia
命令セットとはどういう意味ですか?
命令セットアーキテクチャは、命令セットまたは命令セット階層としても知られ、プログラミングに関連するコンピュータのアーキテクチャの一部であり、基本的なデータ型、命令セット、レジスタ、アドレッシングモード、メモリシステム、割り込み、例外処理、および外部I/Oを含んでいます。---ウィキペディア
指示」とはどういう意味ですか?
コンピュータ技術では、命令は命令セットアーキテクチャによって定義された1つのCPU操作です。より広い意味では、「命令」はバイトコードのような実行可能なプログラムのあらゆる要素の表現になります。
この話はやめられません。バイトコードと機械語については、時間があるときに記事を書きます。
のは、逆アセンブル命令のjavapを呼び出してみましょう、それは同様のアセンブリ命令にバイトコードにすることができます、機械語に相対的なアセンブリ命令は、より理解して良いです。図1を説明するために、実際には、d + "helloworld "の実行で、仮想マシンは、StringBuilderメソッドを呼び出すことであり、その後、eに戻るには、StringBuilderのtoStringメソッドを呼び出すには、StringBuilderのtoString()メソッドだけでなく、新しい方法の使用!
その証拠は?
これは地図のバイトコードを逆アセンブルしたものです。
このようなプログラムだったらどうですか?
この時点で、実行の結果は真であり、再びそのバイトコードを逆アセンブルします。最後のキーワード、バイトコードを追加するだけで確認するには、何が変更されましたか?
6行目のeがhelloworldになっていることがわかりますが、今回はStringBuilderの呼び出しがなく、まだ新しい生成方法ではなさそうです。では、これはなぜですか?
これはコンパイラの定数折りたたみ技法であり、Java独自のものではありません。言語で定義された定数の条件を満たすいくつかの式については、計算の実行時まで待たずに、コンパイラがコンパイルして計算します。
javaには構文的な糖分がかなりあります。
Syntactic Sugar(シンタクチック・シュガー):シンタクチック・シュガーとは、英国のコンピューター科学者ピーター・ラムディン(Peter Lambdin)氏によって作られた造語で、コンピューター言語に追加されるある種の構文のこと。構文解析シュガーは、プログラムをより簡潔にし、読みやすくします。
例:アノテーションは新しいデータ型ではなく、特殊なインターフェースです。もし私の言うことが信じられないなら、アノテーションを分解して見てください。
分解結果。
同期は? これは、なぜ分解で?静的メソッドと非静的メソッドでは、ちょっと違うので、特別記事を書いて紹介します。場合によっては、逆アセンブル命令で明確にわかることもありますが、forとforeachは同じもので、いくつかの違いがあります。
IDEAはjavap -cとjavap -verboseの2つのコマンドで直接設定できるので、毎回CMDを使う必要がなく、便利で高速です。設定方法は、ネット上に非常にわかりやすいチュートリアルがあるので、ここでは紹介しません。





