大工場の面接問題を見て、慌てましたか.

5830 ワード

最近TX音楽Androidエンジニアの面接に参加しました.ここでは面接中のいくつかのポイントを記憶して、面接中のあなたを助けてほしいです(答えはまだ整理中です).
1、Java呼び出し関数が実際のパラメータに入力された場合、値転送ですか、参照転送ですか.
2、単例モードのDCL方式は、なぜ2回目の判定が必要なのか.
    単例モードのDCLは比較的良い単例実現方式であり、面接で聞かれる頻度が非常に高く、考察の方式も多種多様である.本題の質問に基づいて、ここで簡単に整理して、この中のすべての点は心に熟練しているほうがいいです.
 1 public class Test {
 2     private volatile static Test instance;
 3 
 4     private Test() {
 5 
 6     }
 7 
 8     public static Test getInstance() {
 9         if (instance == null) {
10             synchronized (Test.class) {
11                 if (instance == null) {
12                     instance = new Test();
13                 }
14             }
15         }
16         return instance;
17     }
18 }

 ここで5つのポイントに注意してください.
    (1)第1の注意点:プライベートコンストラクション関数を使用して、通常の場合、このクラスが外部で初期化されないことを確保する(非正常な場合、例えば反射によって初期化され、一般的に反射を使用すると単一のモードも効果を失う).
    (2)第2の注意点:getInstance法では第1の判定条件は論理的に除去可能であり,除去後は単例の正確性に影響を及ぼさないが,除去後は効率が低い.削除後、instanceが初期化されているかどうかにかかわらずsynchronized操作が行われ、synchronizedは再操作消費性能であるからです.加えて、初期化して直接結果を返すとsynchronized操作は行われません.
    (3)3つ目の注意点:synchronizedを加えるのは,getInstanceメソッドを複数のスレッドが同時に呼び出す場合に,instanceを1回ずつ初期化する同時問題を防止するためである.
    (4)第4の注意点:getInstanceメソッドの第2の判定条件は除去できないが,除去された場合,ちょうど2つのスレッドaとbが第1の判定条件を通過した.このときaが先にロックを取得しsynchronizedのコードブロックに入りinstanceを初期化し,aがロックを解放すると仮定する.次にbはロックを取得しsynchronizedのコードブロックに入り、instanceも直接初期化され、instanceは単例モードの要求に合致しない~と何度も初期化される.2番目の判定条件を加えると、bはsynchronizedにロックされたコードブロックを取得し、このときinstanceは空ではなく、初期化動作を実行しない.
    (5)5番目の注意点:instanceの宣言にはvoliateキーワードがあり、このキーワードを使用しないと異常が発生する可能性があります.instance=new Test();原子操作ではなく、次のように3つの命令にコンパイルされます.          1)Testのインスタンスにメモリを割り当てる
          2)Testのコンストラクタを初期化する
          3)instanceオブジェクトを割り当てられたメモリ領域に移動します(instanceは空ではありませんので注意).
        それから、javaは命令を並べ替えて、JVMはプロセッサの特性によって、十分に多段キャッシュ、マルチコアなどを利用して適当な命令を並べ替えて、プログラムに業務の運行を保証する同時に、十分にCPUの実行の特徴を利用して、最大の機械の性能を発揮させます!簡単に言えば、jvmが上記の3つの命令を実行する場合、必ずしも1−2−3のように実行されるとは限らず、1−3−2のように実行される可能性がある.jvmが1-3-2で実行されている場合、1-3で実行が完了して2がまだ実行されていない場合、3が実行されている場合、instanceは空ではなく、直接instanceに戻ります.問題は2がまだ実行されていないことです.このときinstanceは何もないに相当し、問題があるに違いありません.それから、voliteには命令の並べ替えを禁止する特性があります.上の3つの命令は1-2-3で実行されています.これで問題ありません.
       参照先:https://blog.csdn.net/hnd978142833/article/details/81633730
3、volatileはどんな作用がありますか.AtomiticIntegerはどのような役割を果たしていますか.底層の実現原理は何ですか.synchronizedキーワードとの違いは何ですか?casにはどんな弊害がありますか?
       マルチスレッドに関する知識点については、volatile、AtomiticInteger、synchronized、casの問題はいずれも高周波試験点であり、それに関連する知識点は、ヘビー級ロック/軽量級ロック、楽観ロック/悲観ロック、JMM(Java Memmory Mode Javaメモリモデル)、ユーザ空間/カーネル空間、マルチスレッドの3要素(原子性、可視性、順序性)、スピン、ABA問題などである.すべて身につけなければならないポイントです.
       おすすめ読書:【シンシュナイザー最下位実装】
                         【面接官は、volatileが30分も吹けるとは思わなかった】
                         【『面接官吊り下げ』シリーズ-楽観ロック、悲観ロック】
                         【「毎日の知識ポイント」CASメカニズムとは何か】
4、Android Logのタグをクラス名.class.getSimpleName()で取得すると、どんな弊害がありますか?
5、反射はどんな作用がありますか.どんな弊害がありますか.
6、放送の底辺の実現メカニズム?なぜAIDL方式より遅いのですか?EventBusとの違いは何ですか?
7、Handlerはどのようにして各スレッドにlooperが1つしかないことを保証しますか?ThreadLocalの役割は?
       この問題は主にThreadLocalを考察し、ThreadLocalを知らない人は博文を読むことができます:【朝花夕拾い】Androidマルチスレッドの(二)ThreadLocal編、および【ThreadLocalとは何かと聞かれたら、この文章を彼に振ってください!】
8、100個の0~100の間の整数、並べ替えを実現
9、RxJava紹介
10、Glide紹介
11、measuredWidthとwidthの違い
      結論:getMeasuredWidth()はviewの元のサイズ、すなわちこのviewがXMLファイルで構成されているか、コードで設定されているサイズを取得します.getWidth()は、このviewが最終的に表示するサイズを取得します.このサイズは元のサイズに等しいか、元のサイズに等しくないかのいずれかです.
      おすすめ読書:【androidでgetWidth()とgetMeasuredWidth()の違い】
12、SparseArrayでは、なぜパフォーマンスが向上するのか
13、MVPとMVVMの違い、MVVMの実現方式
14、共有する時、Android Nはurlに対してどんな制限をし始めましたか?
15、HashSet紹介
16、ソフトリファレンスと弱リファレンスの違いは、いつGCしますか?System.gc()の場合、システムはすぐにシステムゴミを回収しますか?
17、ExceptionとErrorの違いは何ですか.Errorは捕まえられますか?OOM Errorは捉えられますか?
18、Sharepreference commit()とapply()の違い.Sharepreferenceプロセスは安全ですか?スレッドは安全ですか?
19、500 x 500のpngピクチャが占めるメモリサイズ.同じ画像はxxdpi-drawableとdrawableの中で誰がメモリをもっと大きくして、どのくらい大きいですか?
20、RecyclerViewとListViewの違い.
だいたい覚えていますか.面接官は答えの内容に基づいてさらに深く質問し、読者はこの知識点をさらに広げることができます.