序文
テキストは私の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以上のスター):
強くなりたい男のサンワイです。いいね、コレクション、再投稿ありがとうございます。また会いましょう。サンワイを好きにしてください、それはサンワイにとって本当に重要です!