blog

バイトジャンプ2020年Android開発の詳細な議論は、社会的な募集の質問を投稿し、あなたがどこまで行くことができるか見てみる?

ネットワークの噂が2020年になり、Androidの開発が冷え込んでいます!本当でしょうか?多くの友人がキャリアプランについて非常に混乱していると思います!\nおすすめの本を紹介します:\nこの文書は...

Dec 11, 2020 · 5 min. read
シェア

今、インターネット上では「2020年、Androidの開発はとっくに終わっている」という噂が飛び交っています!それは本当ですか?多くの友人がキャリアプランについてとても迷っていると思います

この文書は、あなたが混乱している方向を指し示すのに役立ちます!

1、シングルトンパターンを実装するためにプログラムしてください、怠惰な男と完全な男の書き込み?

2、Javaの生産者-消費者モデルを実装するプログラムを作成してください。

3、HashMapの内部構造? 内部原理?

4、ACTION_CANCELイベントが発生した場合のAndroidのイベント配信メカニズムについて簡単に教えてください。

5.Androidのプロセス間通信、Liunx OSのプロセス間通信。

6、JVM仮想マシンのメモリー構造とその役割。

7、AndroidのView描画処理について簡単に説明してください。

8は、正と負の数を含む、シェーピング配列があり、その後、正の数の左側に配列内のすべての負の数を移動するように求められ、相対的な位置が変更されないことを保証するために、時間の複雑さはO(n)であり、空間の複雑さはO(1)です。例えば、{10, -2, 5, 8, -4, 2, -3, 7, 12, -88, -23, 35}は{-2, -4, -3, -88, -23,5, 8 ,10, 2, 7, 12, 35}に変わります。

第一の側面は、理論とプログラミングの問題が混在していたことです。以下のようなオンライン・プログラミング・ツールが使われました。

1、シングルトンパターンを実装するためにプログラムしてください、怠惰な男と完全な男の書き込み?

//FullerHandwritingpublic static Singleton getInstance(){ 
 if (singleton == null) { 
 synchronized (Singleton.class) { 
 if (singleton == null) { 
 singleton = new Singleton(); 
 } 
 } 
 } 
 return singleton; 
 } //スラッカーを書く
 private static final Singleton1 single = new Singleton1(); 
 //静的ファクトリー・メソッド
 public static Singleton1 getInstance() { 
 return single; 
 } 

2、Javaの生産者-消費者モデルを実装するプログラムを作成してください。

これを参照してください少し混乱して、もし大学の卒業生の時間は、これは確かに問題ありませんが、これは何年も働いている、これは唯一の自分の考えに従って書くことができます。ここでは、同期ロックと待機通知の使用は、比較的単純な達成するために

import java.io.IOException;public class WaitAndNotify{
 public static void main(String[] args) throws IOException
 {
 Person person = new Person(); new Thread(new Consumer("消費者 I", person)).start(); new Thread(new Consumer("コンシューマー・ツー", person)).start(); new Thread(new Consumer("コンシューマー・スリー", person)).start(); new Thread(new Producer("プロデューサー I", person)).start(); new Thread(new Producer("プロデューサー I", person)).start(); new Thread(new Producer("プロデューサー I", person)).start();
 }
}
class Producer implements Runnable
{ private Person person; private String producerName; public Producer(String producerName, Person person)
 { this.producerName = producerName; this.person = person;
 } @Override
 public void run()
 { while (true)
 { try
 {
 person.produce();
 } catch (InterruptedException e)
 {
 e.printStackTrace();
 }
 }
 }
}
class Consumer implements Runnable
{ private Person person; private String consumerName; public Consumer(String consumerName, Person person)
 { this.consumerName = consumerName; this.person = person;
 } @Override
 public void run()
 { try
 {
 person.consume();
 } catch (InterruptedException e)
 {
 e.printStackTrace();
 }
 }
}
class Person
{ private int foodNum = 0; private Object synObj = new Object(); private final int MAX_NUM = 5; public void produce() throws InterruptedException
 { synchronized (synObj)
 { while (foodNum == 5)
 {
 System.out.println("box is fullサイズ= " + foodNum);
 synObj.wait();
 }
 foodNum++;
 System.out.println("produce success foodNum = " + foodNum);
 synObj.notifyAll();
 }
 } public void consume() throws InterruptedException
 { synchronized (synObj)
 { while (foodNum == 0)
 {
 System.out.println("box is empty,size = " + foodNum);
 synObj.wait();
 }
 foodNum--;
 System.out.println("consume success foodNum = " + foodNum);
 synObj.notifyAll();
 }
 }
}

3、HashMapの内部構造? 内部原理?

HashMapの問題では、もはや詳細に、この点での情報は非常に多く、HashMapの内部構造の違いのJava1.7と1.8バージョンに注意を払う必要はあまりありません。

4、ACTION_CANCELイベントが発生した場合のAndroidのイベント配信メカニズムについて簡単に教えてください。

最初の質問については、何の説明もなく、本や資料に書かれている通りです。

ACTION_CANCELはいつトリガーされますか?システム・ドキュメントにはこのような使用例があります:

設定ページでスライドスイッチをデザインする際、ACTION_CANCELを聞いていないと、真ん中までスライドさせたときに、指を上下に動かすと、つまりスイッチの制御の外で動かすと、このときにACTION_UPではなくACTION_CANCELが発動してしまい、結果的にスイッチのボタンが真ん中の位置で止まってしまいます。

5.Androidのプロセス間通信、Liunx OSのプロセス間通信。

これについてもよく聞かれるので、ここでは説明しません。

6、JVM仮想マシンのメモリー構造とその役割。

この質問も比較的基本的なもので、JVMのメモリー構造を以下に示します。

7、AndroidのView描画処理について簡単に説明してください。

8は、正と負の数を含む、シェーピング配列があり、その後、正の数の左側に配列内のすべての負の数を移動するように求められ、相対的な位置が変更されないことを保証するために、時間の複雑さはO(n)であり、空間の複雑さはO(1)です。例えば、{10, -2, 5, 8, -4, 2, -3, 7, 12, -88, -23, 35}は{-2, -4, -3, -88, -23,5, 8 ,10, 2, 7, 12, 35}に変わります。

上記の効果を得るには2つの方法があります:

  • **最初の:**2つの変数、1つは、現在のトラバーサルポイントを記録するために、1つは、配列のインデックス値の左端の負の数を記録します。その後、配列全体を横断し、負の数が負の数の後ろの番号と交換されます遭遇し、横断の終わりには、左側の負の数、右側の正の数を達成することができます。

  • **2番目: **2つの変数が左ノードと右ノードを記録し、それぞれの側で走査が始まります。左のノードは、負の値に遭遇すると続行し、正の値に遭遇すると停止します。右のノードはその逆です。その後、左と右のノードが交換され、左と右のノードが出会うまで探索が再開されます。この手法の時間的複雑度はO(n)。空間の複雑さはO(1)です。

     for(int i=0;i<a.length;i++){ 
     if(a[i]<0){ 
     temp=a[i]; 
     a[i]=a[border+1]; 
     a[border+1]=temp; 
     border++; 
     } 
     } 
     for(int j=0;j<a.length;j++){ 
     System.out.println(a[j]); 
     } 
    } 
    

    // メソッド2public void setParted1(int[] a,int left,int right){

    if(left>=right||left==a.length||right==0){。

    for(int i=0;i< />) { if(left>=right||left==a.length||right==0){。

    System.out.println(a[i]);

    }

    return ;

    }

    while(a[left]<0){

    left++; }.

    }

    while(a[right]>=0){

    right--; }.

    }

    if(left>=right||left==a.length||right==0){。

    for(int i=0;i< />)

    System.out.println(a[i]);

    }

    を返します。

    }

    swap(a,left,right).

    right--; } swap(a,left,right); left++;

    right--; setParted1(a,left,right);

    setParted1(a,left,right); }.

    }

    private void swap(int a[],int left,int right){.

    int temp=0;

    temp=a[left];

    a[left]=a[right];

    a[right]=temp;

    }

    public static void main(String[] args) { { { a[]={1.2

    int a[]={1,2,-1,-5,-6,7,-7,-10};

    new PartTest().setParted1(a,0,a.length-1);

    } 3214567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

もちろん、2つ目の実現の難易度は高くなりますが、そのような条件が満たされる限りは。

この記事はここで終わりですが、Androidプログラマーとして、あなたは

記事の下にコメントをどうぞ!

Read next

JVMについて知っているのはヒープとスタックだけか?

多くのJavaプログラマは、JVMのランタイムデータ領域について言及し、ヒープとスタックと言うでしょう、もちろん、Javaプログラマは、メソッド領域、仮想マシンスタック、ローカルメソッドスタック、ヒープ、プログラムカウンタを与えるこの答えが、永久世代、仮想マシンスタック、ローカルメソッドスタック、ヒープ、プログラムカウンタを与える人もいます。では、実際にどの答えが正しいのでしょうか? まず、上記の答えに必要な2つの概念を紹介します。

Dec 11, 2020 · 4 min read