大きな工場にオファーを求める:面接の質問をリストする

序文

テキストは私のGitHub特集記事に含まれています。スターへようこそhttps : //github.com/ZhongFuCheng3y/3y

今日から、私、サンワイはインタビューシリーズを公式に書き始めました。このインタビューシリーズに「大きな工場に依頼して」という名前を付けました

最後のものは「大きな工場にオファーを依頼する:履歴書を書く方法」と呼ばれていました

だから、この記事は「と呼ばれている:リストのインタビューの質問を提供するために大企業を掲載し

次に始めましょう。

この記事には、サポートするビデオ表示があります:https : //www.bilibili.com/video/BV1nT4y1L71r/ Welcome to Sanlian

インタビューサイト

インタビュアー:「簡単に自己紹介してください」

Sanwai:「私の名前はSanwaiです。現在、Java3yというパブリックアカウントを維持しています。過去数年間で、300以上のオリジナルの技術記事、1,000ページ近くのオリジナルの電子書籍、複数の知識ポイントを備えたマインドマップを書いています。私のビジョンは次のとおりです。あなたが私に注意を払い、3年連続のクラスメートが大昌のオファーを受けることができる限り、私の...」

インタビュアー:「やめろ、やめろ、やめろ、やめろ、正式に始めよう」

インタビュアー:「Javaリストについて話しましょう。リストについてどれだけ知っていますか?」

「リストはJavaのインターフェースです。一般的な実装クラスはArrayListとLinkedListです。ArrayListは開発で最も使用されています。」

インタビュアー:「ArrayListとLinkedListの違いについて別々に話すことができます」

3つの詐欺師:「ArrayListの基になるデータ構造は配列であり、LinkedListの基になるデータ構造はリンクリストです。」

インタビュアー:「では、すでに配列があります。なぜArrayListを使用するのですか?」

3つの詐欺師:「ネイティブ配列には特徴があります。使用する場合はサイズを作成する必要があり、ArrayListは使用しません」

インタビュアー:「それでは、ArrayListの実装方法を教えてください。なぜArrayListはサイズを作成する必要がないのですか?」

3曲がった:「実際、これは事実ですソースコードを見ました。ある場合new ArrayList()デフォルトでObjectサイズ0の空の配列があります。データを初めてadd追加するとき、この配列をサイズで初期化します。デフォルトのサイズは10インチです。

インタビュアー:「うん」

3つの曲がった:「もう1つは、配列のサイズは固定ですが、ArrayListのサイズは可変です」

インタビュアー:「固定変数と可変変数をどのように理解していますか?それについて教えてください。」

3つの曲がったもの:「指定された配列のサイズが10であると仮定すると、配列で要素を埋めるために追加できるのは10要素のみです。ArrayListとは異なり、ArrayListを使用するときは20または30を追加できます。そしてさらに多くの要素」

3つの曲がった:「ArrayListは動的に展開されるため」

インタビュアー:「では、どうやってそれを達成するのですか?」

3つの詐欺師:「ArrayList add使用するたびに、最初に配列に十分なスペースがあるかどうかを計算します。十分なスペースがある場合は、直接追加します。十分でない場合は、拡張する必要があります。」

インタビュアー:「それでは、どのように拡張するのですか?一度にいくらですか?」

3つの曲がった:「ソースコードではgrow元の1.5値を毎回2倍にする方法があります。たとえば、初期化された値は10です。次に、11番目の要素を入力します。この配列のスペースが足りないので、拡張します。 15インチまで

3つの曲がった:「スペースが拡張された後arraycopy、アレイをコピーするために呼び出されます」

インタビュアー:「ええ、はい。では、なぜArrayListが日々の開発で最も使用されると以前に言ったのですか?」

3つの詐欺師:「基盤となるデータ構造によって決定されます。日々の開発では、トラバーサルの必要性は追加と削除だけではありません。追加と削除がリストの最後に追加されることが多いとしても、それは問題ありません。最後に要素を追加するように、ArrayListの時間それの複雑さO(1)。 "

「もう1つは、ArrayListの追加と削除の基になる呼び出しcopyOf()が最適化されいることです。最近のCPUはメモリ操作ブロックでき、ArrayListの追加と削除はLinkedListよりも遅くありません。」

インタビュアー:「ベクターを理解していますか?」

「まあ、Vectorの基本的な構造は配列です。一般に、今ではめったに使用しません。ArrayListと比較すると、スレッドセーフです。拡張すると、2回直接拡張されます。たとえば、要素が10個あります。 、拡張する場合、アレイのサイズは20インチに増加します

インタビュアー:「では、ベクターを使用しない場合、スレッドセーフリストは他に何ですか?」

「まず、Collectionsを使用してArrayListをラップし、スレッドセーフにすることもできます。しかし、これは間違いなくあなたが聞きたいことではありませんjava.util.concurrent。CopyOnWriteArrayList というパッケージの下にもクラスがあります」

インタビュアー:「ええと、あなたは言い続けます」

「CopyOnWriteArrayListについて説明する前に、copy-on-writeこの意味について引き続き説明したいので、以下に省略しますcow。たとえば、Linuxでは、プロセス番号を除いて、すべてのinitプロセスforkプロセスから出てきforkます。デフォルトは、親プロセスとまったく同じです。その前に、2つのプロセスは同じメモリ空間を使用します。forkつまりexec子プロセスのコードセグメント、データセグメント、およびスタックは、親プロセスの物理空間を指します。」

インタビュアー:「うん」

3つの不正:「親子プロセスで動作が変更されると、対応する物理スペースが子プロセスに割り当てられます。これの利点は、実際の変更が発生するまで待機してからリソースを割り当てることです。これにより、割り当てを減らしたり、大量のリソースをコピーしたりできます。瞬時の遅延が原因で発生しました。簡単に言うと、遅延読み込み、またはシングルトンモードの遅延マンスタイルとして理解できます。実際に使用されるときに割り当てられます。」

インタビュアー:「うん」

3つの曲がった:「実際には、ファイルシステム内にありcowます。ファイルシステムのメカニズムは、cowデータを変更するときであり、操作上のデータの元の場所ではなく、再変更する場所です。例:データを変更するにはブロックAのコンテンツ。最初にAを読み取り、ブロックBに書き込みます。この時点で電源が切断されても、Aの元のコンテンツはそのまま残ります。これの利点は、データの整合性を確保でき、一時停止したときに簡単に復元できることです。

3つの詐欺師:「CopyOnWriteArrayListを振り返ってみましょう。CopyOnWriteArrayListはスレッドセーフなリストです。一番下のレイヤーは配列コピーすることで実装されます

3人の曲がった:「そのadd()方法の実現について話させて

インタビュアー:「良い」

add()実際には、メソッドでlockロックを追加し、新しい配列を、配列addの実際の要素内の新しい配列にコピーしました。これは、新しい配列に変更される最後のポイントです。」

「実際には、get()メソッドまたはsize()メソッドは、配列が指す配列の要素またはサイズを取得するだけです。読み取りはロックされず、書き込みはロックされます」

3つの曲がった:「CopyOnWriteArrayListがファイルシステムのCOWメカニズムに非常に類似していることがわかります」

インタビュアー:「それでは、CopyOnWriteArrayListの短所について話していただけますか?」

「明らかに、CopyOnWriteArrayListはメモリを大量に消費しset()/add()、配列は毎回コピーさます。さらに、CopyOnWriteArrayList データの最終的な一貫性しか保証できませんがデータのリアルタイムの一貫性は保証できません。2つのスレッド、スレッドAがCopyOnWriteArrayListのデータの読み取りはまだ完了していません。スレッドBがこのリストを空にしたので、スレッドAはこの時点でも残りのデータを読み取ることができます。

インタビュアー:「ええ、大丈夫です。今日のインタビューは終わりました。私に尋ねることはありますか?」

サンワイ:「今日の私のパフォーマンスについてどう思いますか?」

インタビュアーは:「今日のパフォーマンスは大丈夫です、あなたが100を持っていない場合。好きなこの時間は、HRは再度ご連絡はありません100の以上の場合。同類、第二ラウンドでも実行します。」

インタビュアー:「公開します。マップコレクションを準備できます。次のラウンドではマップの知識を調べます

余談

リストの収集は一般的にそれほど難しくありませんが、CopyOnWriteArrayListはまだ多くの学生に知られていない可能性があります。

この記事には、サポートするビデオ表示があります:https : //www.bilibili.com/video/BV1nT4y1L71r/ Welcome to Sanlian

Javaバックエンドのすべてのナレッジポイントをカバーするオープンソースプロジェクト(すでに10K以上のスター):

強くなりたい男のサンワイです。いいね、コレクション、再投稿ありがとうございます。また会いましょう。サンワイを好きにしてください、それはサンワイにとって本当に重要です!

おすすめ

転載: blog.csdn.net/Java_3y/article/details/108140474