4つの基本的なJavaの質問のうち何がわかりますか?
1。==シンボルの使用
まず、より興味深いコードを見てください
整数a = 1000、b = 1000;整数C = 100、d = 100; public void mrun(最終文字列名){new runnable(){public void run(){system.out.println(name); }}; } system.out.println(a == b); System.out.println(c == d);この質問に対する正しい答えを得て、原則を理解できるなら。それはあなたの基本が大丈夫であることを意味します。あなたの答えが真実で真実であれば、あなたの基盤は不足しています。
まず、答えを公開し、コードを実行すると、虚偽が真実になります。 == 2つのオブジェクトの参照を比較することがわかります。ここのABCDは、両方とも新しく作成されたオブジェクトです。理論的には、falseを入力する必要があります。これはこの質問について興味深いことです。インタビューの質問であろうとフォーラムのディスカッションエリアであろうと、この質問の外観率は非常に高いです。原則は実際には非常に単純です。 integer.javaクラスを見てみましょう。
public static integer valueof(int i){return i> = 128 || I <-128?新しい整数(i):small_values [i + 128]; } / ** * {@link integer#valueof(int)}およびauto-boxing * / private static final integer [] small_values = new Integer [256]; static {for(int i = -128; i <128; i ++){small_values [i+128] = new Integer(i); }}整数c = 100;を宣言するとき。この時点で、自動ボクシング操作が実行されます。簡単に言えば、基本的なデータ型を整数オブジェクトに変換し、それを整数オブジェクトに変換することを意味します。 -128-127が整数でキャッシュされていることがわかります。公式の説明は、少数がより頻繁に使用されるため、パフォーマンスを最適化するために、それらの間の数はキャッシュされているということです。これが、この質問に対する答えが虚偽である理由です。宣言された整数オブジェクトの値が-128-127の間にある場合、同じオブジェクトが参照されるため、結果は真です。
2。文字列
次に、コードを見てください
文字列s1 = "abc";文字列s2 = "abc";文字列s3 = new String( "ABC"); System.out.println(s1 == s2); System.out.println(s1 == s3);
この質問に対する答えは何ですか?
==の構文によれば、まず第一に、S1、S2、およびS3は3つの異なるオブジェクトです。常識、出力はすべて偽です。ただし、プログラムの実行結果は確かに真実であり、偽です。 2番目の出力Falseは理解でき、最初の出力は再び困惑しています。いくつかの基本的なタイプ変数とオブジェクトの参照変数が関数のスタックメモリに割り当てられ、新しいオブジェクトと配列はヒープメモリに保存されます。ただし、これに加えて、定数プールと呼ばれる別のエリアがあります。通常、文字列s1 = "abc";が必要なように、宣言された文字列オブジェクトの値は一定のプールに保存されます。文字列S1 = "ABC"などのオブジェクトを作成すると、「ABC」は一定のプール(文字列プールとも呼ばれます)に保存されます。参照文字列S2 = "ABC"を作成すると、Javaの基礎となる層は、「ABC」が定数プールに存在するかどうかを見つけることを優先します。存在する場合は、S2をこの値を指して、再現しません。一定のプールがない場合は、作成されてプールに追加されます。だから答えは真実であり、偽です。
3.最終キーワード<BR />コードを見てみましょう
public void mrun(final string name){new runnable(){public void run(){try {thread.sleep(1000); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } system.out.println(name); } }。始める(); }誰もがこの種のコードをたくさん書いていると思います。内部クラスがローカル変数にアクセスする場合、ローカル変数の前に最終的な修飾子を追加する必要があります。そうしないと、コンパイラがエラーを報告します。通常、私たちは同じことをします。 OK、2番目の質問は、なぜ最終的な修飾子を追加するのですか?私の友人のほとんどは、この問題について考えたことがないと思います。彼らがそれを使用するときはいつでも、それを直接追加するだけで、原則を掘り下げたことはありません。これは、優れたプログラマーにとって望ましくありません。私たちは真実だけでなく理由も知っている必要があります。
次に、最終的なキーワードを追加する必要がある理由を分析しましょう。まず、内部クラスのライフサイクルはメンバーレベルにあり、ローカル変数のライフサイクルはメソッドボディにあります。言い換えれば、この状況が発生します。 MRUNメソッドが実行されると、新しいスレッドが実行され、新しいスレッドが1秒間スリープされます。メインスレッドは引き続き実行され、Mrunが実行され、名前属性のライフサイクルが終了します。 1秒後、syetem.out.printth(name)が実行されます。しかし、現時点では、名前は死んでおり、もはや記憶にありません。 Javaはこのエラーを排除することであり、最終的なキーワードで内部クラスのローカル変数を厳密に変更する必要があります。ローカル変数が最終的に変更された後、ローカルレプリカがメモリに保持されます。内部クラスにアクセスすると、実際にアクセスされます。これは、ローカル変数のライフサイクルを長くするようなものです。結局のところ、事前にこのピットを埋めたのはJavaエンジニアでした。そうでなければ、何人の友人が内部のローカル変数を心配するのだろうと思います。
4。整数およびint
次のコードを見てください
整数a = new Integer(1000); int b = 1000; integer c = new Integer(10);整数d = new Integer(10); System.out.println(a == b); System.out.println(c == d);
この質問は、最初の質問のフォローアップです。この質問に対する答えをすばやく取得できる場合は、==比較機能をより徹底的に習得していても、おめでとうございます。
正解を明らかにします:true、false
この答えを見た後、多くの友人が困惑しています。最初に2番目のものについて話しましょう。最初の質問によると、整数は-128-127にキャッシュされていませんか?これは真実であるはずですが、よく見ると、ここの整数はキャッシュを使用せずに作成されるため、結果は間違っています。それでは、最初のものが再び真である理由を見てみましょう。まず第一に、ここでの値は1000です。これは間違いなく整数キャッシュとは何の関係もありません。キャッシュとは何の関係もないため、aは新しい新しいものからのオブジェクトであり、入力はfalseでなければなりません。ただし、ここではBがintタイプであることに注意してください。 intとintegerの比較==の場合、Javaは整数、つまり整数をintタイプに変換するため、intタイプの値をここで比較するため、結果は真です。
いくつかの質問を正しく行った後、急いで省略を確認し、自分のテストレベルに従ってギャップを埋めてください!