序文
18年の卒業以来、私は2つの会社で働き、いくつかの大小のプロジェクトを行ってきました.Androidの成長パスと教師と友人の関係について多くのガイダンスを与えてくれた2人の上司にとても感謝しています。
私は何年も前から多くの企業へのインタビューに参加しており、他の企業だけでなく、いくつかの巨人からもオファーを受けています。経験を要約することは、過去のレビューと要約でもあります。
ネットワーク:階層化モデル、TCP、UDP、HTTP、HTTPS
階層モデル
- アプリケーション層:HTTP、FTP、DNSなどの特定のアプリケーションの詳細を処理する責任があります
- トランスポート層:TCP、UDPなどの2つのホストにエンドツーエンドの基本的な通信を提供します
- ネットワーク層:IPなどのパケット送信、ルーティングなどを制御します
- リンク層:オペレーティングシステムのデバイスドライバー、ネットワークカード関連のインターフェイス
UDP
- UDPヘッダー構造:送信元ポート、宛先ポート、長さフィールド、チェックサム
- 特徴:信頼性が低く、無秩序で、メッセージ指向で、高速で、軽量
- 該当するシナリオ:インスタントメッセージング、ビデオ通話などに適しています。
- アプリケーション:DHCP、DNS、QUCI、VXLAN、GTP-U、TFTP、SNMP
TCP
- TCPヘッダー構造:送信元ポート、宛先ポート、シーケンス番号、確認シーケンス番号、SYN / ACKおよびその他のステータスビット、ウィンドウサイズ、チェックサム、緊急ポインタ
- 特徴:バイトストリーム指向、輻輳とフロー制御、信頼性、整然とした、低速、および重いフロー制御と輻輳制御はスライディングウィンドウを介して実現されます
- 該当するシナリオ:ファイル転送、ブラウザなど。
- 更新用:HTTP、HTTPS、RTMP、FTP、SMTP、POP3
- 3つのハンドシェイク:
1\. C->S:SYN,seq=x(你能听到吗?)
2\. S->C:SYN,seq=y,ack=x+1(我能听到,你能听到吗?)
3\. C->S:ACK,seq=x+1,ack=y+1(我能听到,开始吧)
两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需要三次握手
复制代码
- 4回振る:
1\. C->S:FIN,seq=p(我说完了)
2\. S->C:ACK,ack=p+1(我知道了,等一下,我可能还没说完)
3\. S->C:FIN,seq=q,ACK,ack=p+1(我也说完了)
4\. C->S:ACK,ack=q+1(我知道了,结束吧)
S 收到 C 结束的消息后 S 可能还没说完,没法立即回复结束标示,只能等说完后再告诉 C :我说完了
复制代码
HTTP
- ハイパーテキスト転送プロトコル、クリアテキスト送信、デフォルトポート80
- POSTおよびGET:GetパラメーターはURLに配置され、Postパラメーターはリクエスト本文に配置されます
- Webページアクセスプロセス:DNSドメイン名の解決、接続を確立するためのTCPスリーウェイハンドシェイク、HTTP要求の開始
HTTPS
- デフォルトのポートは443で、HTTP送信データはSSLプロトコルを使用して暗号化されています。これは安全です。
- 暗号化プロセス:クライアント/サーバーは非対称暗号化によってキーを生成し、このキーを使用して送信データを対称的に暗号化します
アルゴリズム:データ構造、一般的に使用されるアルゴリズム
データ構造
- 配列、リンクリスト
- スタック、キュー
- ハッシュ表
- 木、山、図
一般的に使用されるアルゴリズム
- ソート
- ダブルポインタ、スライディングウィンドウ、文字列
- 再帰、分割統治、二分法
- バックトラック、貪欲、動的な計画
Javaの基本:StringBuilder、一般的な消去、例外、IO、コンテナー
StringBuilder
- StringBufferはスレッドセーフですが、StringBuilderはスレッドセーフではありません
- +実際、これはStringBuilderによって実現されるため、非ループ本体を直接使用できます+が、StringBuilderは頻繁に作成されるため、ループ本体は使用できません。
- String.concatは本質的に新しい文字列であり、並べ替えに非効率的で時間がかかります。StringBuilder<StringBuffer <concat <+
一般的な消去
- 変更されたメンバー変数などのクラス構造に関連するジェネリックは消去されません
- コンテナジェネリックは消去されます
例外和エラー
- 例外とエラーの両方がThrowableから継承されます
- エラーは主にOOMなどの回復不能なエラー状態を指すため、キャプチャする必要はありません。
- 例外分是チェック済み例外和UnCheckedException
- CheckedException:io操作など、コンパイラーによって明示的にキャッチおよびチェックされる必要があります
- UnCheckedException:nullポインター、範囲外の配列などのキャプチャを表示する必要はありません。
IO、NIO、OKIO
- IOはストリーム指向であり、一度に1バイトを処理し、NIOはバッファー指向であり、一度に1つのデータブロックを生成または消費します。
- IOはブロッキング、NIOは非ブロッキング
- NIOはメモリマッピングをサポートしています
- ioやnioと比較して、okioはよりシンプルで使いやすいAPIを備えています
- okioはタイムアウトメカニズムをサポートしています
- okioはパフォーマンスを向上させるために時間のためのByteStringスペースを導入します
- Okioはメモリ共有にセグメントメカニズムを使用し、コピー時間の消費を節約します
ArrayList、LinkedList
- 配列リスト
- 配列の実装に基づいて、高速検索:o(1)、低速の追加と削除:o(n)
- 初期容量は10で、容量はSystem.arrayCopyメソッドによって拡張されます。
- LinkedList
- 二重リンクリストに基づく実現、遅い検索:o(n)、速い追加と削除:o(1)
- キューとスタックへの呼び出しをカプセル化します
HashMap、HashTable、HashSet
-
HashMap(キー/値をnullにすることができます)
- 配列と単一リンクリストの実装に基づいて、配列はHashMapの本体です。リンクリストは、ハッシュの競合を解決するために存在し、キーと値を組み合わせたエンティティを格納します。
- 配列インデックスはkey.hashCode(これも2回ハッシュされます)によって取得され、リンクリストのkey.equalsによってインデックスが付けられます。
- ハッシュの衝突が同じバケットに入ると、リンクリストの先頭に直接配置されます(java1.8以降は末尾に配置されます)
- JAVA 8のリンクリストの数が8を超えると、赤黒木ストレージに変換され、検索時間はO(n)からO(logn)に変わります。
- 配列の長さは常に2のn乗です。このように、余りはビット演算で実現できるため、インデックスは配列の長さの範囲内に収まります。
- 負荷率(デフォルトは0.75)は、拡張のために追加される充填率を示します。充填率が大きい:リンクリストが長く、検索が遅い;充填率が小さい:リンクリストが短く、検索が速い
- 容量を拡張するときは、元の配列の2倍の長さを直接作成してから、元のオブジェクトをハッシュして新しいインデックスを見つけ、それを再配置します
-
HashTable(キー/値をnullにすることはできません)
- データ構造はHashMapと同じです
- スレッドセーフ
-
HashSet
- HashMapの実装に基づいて、要素はHashMapのキーであり、値は固定値で渡されます
ArrayMap、SparseArray
-
ArrayMap
- 2つの配列に基づく実装。1つはハッシュを格納し、もう1つはキーと値のペアを格納します。
- ハッシュを格納する配列が順序付けられ、検索時にバイナリ検索が使用されます
- ハッシュの競合が発生すると、キーと値のペアの配列が継続的に格納され、検索もkey.equalsによってインデックスが付けられます。見つからない場合は、同じハッシュ値を持つキーと値のペアの配列が逆方向にトラバースされてから順方向にトラバースされます。 。
- 容量を拡張する場合、HashMapを直接2倍にするのとは異なり、メモリ使用率が高くなります。ハッシュテーブルを再構築する必要はなく、パフォーマンスが高いsystem.arraycopy arraycopyを呼び出すだけです。
- データ量が多い場合、バイナリ検索は赤黒木よりもはるかに遅いため、大量のデータ(1000未満)の保存には適していません。
-
SparseArray
- ArrayMapに基づいて、キーは特定のタイプのみにすることができます
同時コレクション
- ConcurrentHashMap
- データ構造は、HashMap、または配列とリンクリストと同じです。
- 脳なしでプットとゲットの操作を直接同期するHashTableとは異なり、セグメントロックテクノロジーを使用する
- 値がvolatileで変更されて行が表示されるようになり、パフォーマンスが非常に高いため、get操作はロックされません。
- java1.8以降、セグメントロックが削除され、CASオプティミスティックロックと同期が使用されます。
LRUCacheの原則
- アクセスの順序に基づいてLinkedHashMapを実装すると、最後にアクセスされたものが最後にランク付けされます
やっと
記事の長さを考慮して、これらの質問と回答、長年のインタビューで出会った質問、およびいくつかのインタビュー資料をPDFドキュメントにまとめました。友人が必要な場合は、私にメールしてください[インタビュー]無料で受け取る
Androidのインタビュー資料の概要を受け取るには、ここをクリックしてください
BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC% 81.md)**
[外部リンク画像が転送されています...(img-5FWI5KPr-1614154915374)]
[外部リンク画像が転送されています...(img-OQJb2MiB-1614154915378)]
それが好きな友達はフォローしたり、転送したり、ありがとうございます!