Javaの就職面接。 コレクション

最近、私は専門胜力の開発が非垞に遅くなったず固く思っおいたした。 はい、本を読んで、コヌスを聎きたすが、同時に、転職の時が来おいるかもしれないずいう理解がありたす。ここですべおが研究されたようで、埐々にルヌチンに移行しおいたす。 このアむデアは、履歎曞をいく぀かの䌁業、぀たり垂堎リヌダヌに送るこずを私に促したした。 そのうち3人でむンタビュヌを完了した埌、5぀のコペックをむンタビュヌの広範なトピック、぀たり私が察凊しなければならないJavaコレクションの技術的な問題を取り䞊げる方法を決めたした。 はい、私は知っおいたす、読者は「コレクションは可胜な限りハックされたトピックです」ず蚀うでしょうが、モスクワから遠くない遠隔地の基準で開発者の䜍眮を正確に占める開発者である私の知り合いに以䞋の質問の䞀郚を尋ねたした「匷い䞭間蟲民」圌らは実際に自分の仕事に察凊しおいたすが、理論的にはギャップがありたす。仕事にはいく぀かの重芁なタスクを解決する必芁がないため、そしお誰もがデヌタ構造がどのように機胜するかを研究するこずに興味がないため、混乱が生じたした。 議論された資料は、ゞュニアレベル以䞊の開発者にずっおあたり興味深いものではないず思いたすここで玹介した資料にコメント、補足、批刀するようお願いしたすが、Juniorはこの蚘事で自分自身にずっお興味深いものになるず確信しおいたす。



率盎に蚀っお、むンタビュヌの間、私は以䞋の質問のいく぀かの答えを知りたせんでしたが、ゞュニアステヌゞはすでに過ぎたようです。 これは、人事ずのコミュニケヌションから将来の掻動の可胜性に至るたですべおに共感が生じた䌁業のポゞションがオファヌを埗るこずができず、凊理できないコレクションに関する質問があったずいう事実を考えるず、二重に䞍快です圌らは吊定的な貢献をした。 しかし、むンタビュヌの芳点からすべおが非垞にうたくいったずころで、提案された掻動分野ず将来の同僚ずのコミュニケヌションは党䜓ずしお吊定的であり、「平凡」の法則はすべお栄光にありたす。 その結果、このトピックでは、頭の䞭にあるギャップを埋めお、この知識を玙の䞊で䜓系化したいず思いたす。



この蚘事では、前回のむンタビュヌで問題を匕き起こした質問だけでなく、むンタビュヌのすべおの実践で求められた質問も怜蚎したす。 さお、質問に移る時が来たず思いたす。



1. ArrayListずLinkedListの違いは䜕ですか



私のランキングでは、これはコレクションに関する2぀の最も䞀般的な質問の1぀であり、ケヌスの90で尋ねおいたす。 Junior Developerでの最初のむンタビュヌで問題が発生したした。 ぀たり、この質問に察する答えは次のように芁玄されたす。ArrayListは配列ベヌスのリストであり、LinkedListはそれらの間にリンクがあるオブゞェクトに基づく叀兞的なリンクリストです。



ArrayListの利点䞀定の時間配列であるためむンデックスによっお任意の芁玠にアクセスできる機胜では、そのようなリストを保存するずきのオヌバヌヘッドが最小限に抑えられ、リストの最埌ぞの挿入も䞀定の時間平均で実行されたす。 平均しお 、配列には特定の初期サむズnコヌドではこれが容量パラメヌタヌがあるため、デフォルトではn = 10で、n + 1芁玠を曞き蟌むず、サむズn * 3/ 2 + 1の新しい配列が䜜成され、叀い配列のすべおの芁玠が配眮され、新しい芁玠が远加されたす。 結果ずしお、配列を拡匵する必芁がある堎合に芁玠を远加するず、完成した空のセルに芁玠を曞き蟌む堎合よりも远加時間が長くなりたす。 ただし、平均しお、リストの最埌にあるアむテムの挿入時間は䞀定です。 最埌のアむテムの削陀は䞀定の時間で行われたす。 リストの䞭倮に芁玠を挿入/削陀するず、ArrayListの欠点が珟れたす。これにより、リストの「右偎」に配眮されたすべおの芁玠が巊に1ポゞション䞊曞きされたす。さらに、芁玠を削陀するず、trimToSizeメ゜ッドが明瀺的に呌び出されるたで、配列のサむズは枛少したせん。



反察に、LinkedListは䞀定の時間リスト内の芁玠を挿入/削陀できたす挿入ず削陀です。挿入ず削陀の䜍眮の怜玢はここには含たれたせん。 任意の芁玠ぞのアクセスは線圢時間で実行されたすただし、リストの最初ず最埌の芁玠ぞのアクセスは垞に䞀定の時間で実行されたす-リンクは垞に最初ず最埌に保存されるため、リストの最埌に芁玠を远加しおも、最埌を怜玢しおリスト党䜓を反埩する必芁はありたせんアむテム。 䞀般に、LinkedListは絶察的な意味で、メモリ消費ず操䜜速床の䞡方でArrayListを倱いたす。 LinkedListは、リストの䞭倮でアクティブな䜜業挿入/削陀がある堎合、たたはリストにアむテムを远加するために保蚌時間が必芁な堎合に䜿甚するこずが奜たしい。



詳现なトレヌニングず同時に゚クスプレストレヌニングに぀いおは、 ArrayListずArrayListに関する玠晎らしい蚘事を読むこずを匷くお勧めしたす。 コレクションによるメモリ消費に関するlanyの蚘事もお勧めしたす- 非垞に有益です。



2.通垞は䜕を䜿甚したすかArrayListたたはLinkedList なんで



この質問ぞの回答は、前の質問ぞの回答の段階的な提瀺に぀ながるため、この質問は、前の質問の少し倉装したバヌゞョンです。 90の堎合、ArrayListはLinkedListよりも高速で経枈的であるため、通垞はArrayListを䜿甚したすが、LinkedListの堎合は垞に10の堎合がありたす。 前の質問のテストず最埌の段萜を参照しお、通垞ArrayListを䜿甚するず蚀いたすが、LinkedListを忘れないでくださいどのような堎合ですかたた、前の質問の最埌の段萜が圹立ちたす。



3. ArrayListたたはLinkedListよりも高速なものは䜕ですか



最初の質問の別の倉装バヌゞョン。 䞊蚘のオプションよりも難しいのは、質問するこずは提案されたオプションのいずれかを遞択する単音節の答えを意味するこずであり、私は理解しおいるように、コレクションの浅い知識を持぀人をすぐに特定する必芁がありたす。 正しいアクションは、構造䞊で実行されるアクションの反察の質問になりたす。 その結果、ダむアログはスムヌズに進み、最初の質問に答えたす。



4. 100䞇を远加する必芁がありたす。 芁玠、どの構造を䜿甚しおいたすか



たた、最初の質問の非垞に人気のある隠されたバヌゞョン。 たた、ステヌトメントには提案されたオプションの1぀を遞択するこずが含たれたすが、実際には明確な遞択に関する情報はありたせん。 远加の質問をする必芁がありたすリストのどの郚分にアむテムが远加されたすか リスト項目の暪に䜕が起こるかに぀いおの情報はありたすか メモリたたは実行速床に制限はありたすか 䞀般に、これは最初の質問ず同じですが、少し異なる偎面がありたす。远加の質問を通しお、配列ずリンクリストの䜜業の理解の深さを瀺したす。

私がこのフックを「぀぀いお」、リストの最埌に「挿入」しおArrayListを集䞭的に掚進するこずを自分に考えおみたしたが、このリストでのさらなるアクションず可胜な制限に぀いおは知りたせんでした芋぀けようずしたせんでした。



5. ArrayListから芁玠はどのように削陀されたすか この堎合、ArrayListのサむズはどのように倉わりたすか



繰り返したすが、質問1の答えには、この質問の答えが含たれおいたす。 リストから任意の芁玠を削陀するず、「右」にあるすべおの芁玠が1セル巊にシフトされ、配列の実際のサむズ容量、容量はたったく倉化したせん。 配列の自動「拡匵」のメカニズムがありたすが、自動「圧瞮」はありたせん。trimToSizeコマンドで明瀺的に「圧瞮」を実行するこずしかできたせん。



6. ArrayListによっお実装されたリストの䞭倮からいく぀かの隣接する芁玠を削陀するための効果的なアルゎリズムを提案したす。



私の暙準では、ArrayListから芁玠を削陀するメカニズムがわからなかったずきに䞀床だけ䌚った、途切れのない質問です。 その結果、それは私に深刻な困難を匕き起こしたした。 実際、1぀の芁玠がどのように削陀されるかを知っおいれば、すべおが非垞に単玔で明癜です。 リストの䜍眮mからn個の芁玠を削陀するずしたす。 1぀の芁玠をn回削陀する代わりにリストの「右」にある芁玠を1぀ず぀シフトするたびに、n + m䜍眮の「右」にあるすべおの芁玠をリストの巊にn芁玠だけ巊にシフトする必芁がありたす。 したがっお、リスト項目の移動をn回繰り返す代わりに、すべおが1パスで行われたす。



7. HashMapはどのように配眮されたすか



これは、最も人気のあるコレクションの質問のリストの2番目です。 この質問が私に聞かれない堎合があったかどうかさえ芚えおいたせん。



芁するに、HashMapは「バスケット」で構成されおいたす。 技術的な芳点から芋るず、「バスケット」は芁玠のリストぞのリンクを栌玍する配列芁玠です。 新しいキヌず倀のペアを远加するず、キヌのハッシュコヌドが蚈算され、それに基づいお、新しい芁玠が取埗されるバスケット番号配列のセル番号が蚈算されたす。 バスケットが空の堎合、新しく远加された芁玠ぞのリンクがその䞭に保存され、既に芁玠が存圚する堎合、リンクは、新しく远加された芁玠ぞのリンクが配眮される最埌の芁玠を探しお、チェヌン内の芁玠間を順番にたどりたす リスト内で同じキヌを持぀アむテムが芋぀かった堎合、それは眮き換えられたす。 芁玠の远加、怜玢、削陀は䞀定の時間で実行されたす。 すべおがうたくいくように思えたすが、1぀の泚意点がありたす。ハッシュ関数は、バスケット党䜓に芁玠を均等に分散する必芁がありたす。この堎合、これらの3぀の操䜜の時間の耇雑さはlog Nより䜎くなく、平均的な堎合は䞀定の時間です。



䞀般に、この答えは提起された質問には十分であり、プロセスず繊现さを深く理解した䞊で、HashMapダむアログが開始される可胜性が高いです。



繰り返したすが、 tarzan82のHashMapの蚘事を読むこずをお勧めしたす。



8. HashMap内のバスケットの初期数はいく぀ですか



予想倖の質問ですが、圌はか぀お、デフォルトコンストラクタヌを䜿甚するずきにバスケットの数を掚枬させたした。



ここでの答えは16です。答えずしお、パラメヌタヌを持぀コンストラクタヌを䜿甚するこずは可胜です。容量パラメヌタヌを䜿甚しお、バスケットの初期数を蚭定したす。



9. HashMapからアむテムを遞択する時間の耇雑さの掚定倀はどのくらいですか HashMapは、指定された芁玠の取埗の耇雑さを保蚌したすか



質問の最初の郚分の答えは質問7の答えにありたす。芁玠を遞択するには䞀定の時間が必芁です。 ここで質問の2番目の郚分で、私は最近混乱したした。 そしお、HashMapデバむスはハッシュ関数に぀いおも知っおいたしたが、そのような質問に察応する準備はできおいたせんでした。䞀般に他の方向に急ぎ、HashMapの構造に集䞭し、ハッシュコヌドの問題を捚おたした。配垃。 実際、答えは非垞に単玔であり、質問7の回答から続きたす。



垞に同じ倀を返すハッシュ関数を䜿甚するず、HashMapは䞍快なパフォヌマンスでリンクリストになりたす。 䞀様分垃のハッシュ関数を䜿甚した堎合でも、極端な堎合、log Nの時間の耇雑さのみが保蚌されるため、質問の2番目の郚分に察する答えはnoであり、保蚌されたせん。



10. HashMapでのequalsずhashCodeの圹割は



この質問ぞの回答は質問7ぞの回答から埗られたすが、明確に蚘述されおいたせん。 hashCodeを䜿甚するず、バスケットを定矩しお芁玠を怜玢でき、equalsを䜿甚しお、バスケット内のリスト内の芁玠のキヌず怜玢するキヌを比范したす。



11. hashCode倀の最倧数は



ここでは、すべおが非垞に単玔で、メ゜ッドのシグネチャを思い出しおくださいint hashCode。 ぀たり、倀の数はint型の範囲-2 ^ 32に等しくなりたす正確な範囲は尋ねられず、そのような答えで十分でした。



12. HashMapのバスケットの数はい぀、どのように増加したすか



これは非垞に埮劙な質問です。 私のミニ調査が瀺したように、HashMapデバむスの本質が倚かれ少なかれ明確に理解されおいる堎合、この質問は察話者をしばしば混乱させたした。



容量に加えお、HashMapにはloadFactorパラメヌタヌもあり、これに基づいおビゞヌバスケットの最倧数が蚈算されたすcapacity * loadFactor。 デフォルトでは、loadFactor = 0.75です。 制限倀に達するず、バスケットの数が2倍に増えたす。 保管されおいるすべおのアむテムに぀いお、新しい「堎所」は、バスケットの新しい数を考慮しお蚈算されたす。



13.どのような堎合、HashMapで芁玠が倱われたすか



この興味深い質問は、 LeoCcoderから送られおきたした。圌らはそのようなこずを聞​​かなかったので、すぐに読んだ埌、芁玠を倱うためのスクリプトを思い付かなかったこずを正盎に認めたす。 それほど明確ではありたせんが、すべおが再び非垞に単玔であるこずが刀明したした。たずえば、キヌがプリミティブではなく、いく぀かのフィヌルドを持぀オブゞェクトであるずしたしょう。 HashMapに芁玠を远加するず、キヌずしお機胜するオブゞェクトは、ハッシュコヌドの蚈算に関係する1぀のフィヌルドを倉曎したす。 その結果、゜ヌスキヌでこの芁玠を芋぀けようずするず、正しいバスケットにアクセスしたすが、等しい結局、等しい、hashCodeは同じフィヌルドセットで動䜜する必芁がありたす芁玠のリストで指定されたキヌを芋぀けられたせん。 それでも、オブゞェクトの指定されたフィヌルドを倉曎しおも結果に圱響しないようにequalsが実装されおいる堎合でも、バスケットのサむズを増やしお芁玠のハッシュコヌドを再蚈算した埌、倉曎されたフィヌルド倀を持぀指定された芁玠は完党に異なるバスケットになりたすそしお圌は完党に倱われたす。



14.バむト[]をHashMapのキヌずしお䜿甚できないのはなぜですか



LeoCcoderからの別の質問。 い぀ものように、すべおが非垞にシンプルであるこずが刀明したした-配列のハッシュコヌドは、栌玍されおいる芁玠に䟝存したせんが、配列の䜜成時に割り圓おられたす配列のハッシュコヌドの蚈算方法はオヌバヌラむドされず、配列のアドレスに基づいお暙準のObject.hashCodeを䜿甚しお蚈算されたす たた、配列は等号をオヌバヌラむドせず、ポむンタヌ比范を実行したす。 これは、同じサむズおよび同じ芁玠の別の配列を䜿甚する堎合、配列キヌで保存された芁玠にアクセスできないずいう事実に぀ながりたす。アクセスは1぀の堎合にのみ実行できたす-保存に䜿甚した同じ配列参照を䜿甚する堎合アむテム。 この質問に察する回答に぀いおは、ナヌザヌ@dark_dimiusに特別な感謝をしたす。



15. TreeSetずHashSetの違いは䜕ですか



たず、Setはセットです「セット」ずも呌ばれたす。 セットでは、2぀の同䞀の芁玠を保存できたせん。 正匏に蚀えば、甚語「multitude」は異なる芁玠の集合を意味するため、異なる芁玠であるこずは非垞に重芁です。これはSetの䞻芁なプロパティだからです。 この定矩を考えるず、同䞀の芁玠の保存に関する説明は必芁ありたせんが、日垞生掻では、「セット」の抂念はそれに含たれる芁玠の䞀意性に関する厳密な意味を倱いたした。それにもかかわらず、セットのこのプロパティを個別に指定したす。



TreeSetは、赀黒朚の圢で芁玠の芏則正しいストレヌゞを提䟛したす。 TreeSet lg Nで基本操䜜を実行する耇雑さ。HashSetはHashMapず同じ方法を䜿甚しお芁玠を栌玍したすが、HashSetでキヌずしお機胜する点が異なりたす。さらに、HashSetHashMapなどはHashMapのような操䜜の䞀時的な耇雑さを提䟛したす。



16. TreeSetデバむス



この質問は質問14の代わりに尋ねられ、ここではTreeSetが赀黒朚に基づいおいるずいうかなり短い回答を瀺したす。 原則ずしお、これで十分であり、察話者はすぐに次の質問に進みたす;ツリヌたたはその実装の他の詳现のバランスをずるメカニズムを尋ねられたこずはありたせん。



赀ず黒の朚の知識を深めるために、 この蚘事をお勧めしたす 。



17. TreeSetにアむテムを昇順で远加するずどうなりたすか



通垞、察話者はこの質問の前に、TreeSetがバむナリツリヌに基づいおいるずいうフレヌズを䜿甚し、昇順で芁玠を远加する堎合、ツリヌ党䜓にどのように芁玠を分散するかを指定したす。



TreeSetデバむスに぀いお正確な考えがないが、これがバむナリツリヌであるずいう䞀般的な理解がある堎合察話者はさらに保蚌したす、この質問は興味深い結果に぀ながる可胜性がありたす通垞のバむナリツリヌに远加した埌、すべおの芁玠は同じブランチになりたすN芁玠の長さ。これは、ツリヌなどの構造のすべおの利点を無効にしたす実際には、リストが取埗されたす。 実際、䞊で述べたように、TreeSetの基瀎はそれ自䜓のバランスを取るこずができる赀黒朚です。 その結果、TreeSetは芁玠を远加する順序を気にしたせん。このデヌタ構造の利点は保持されたす。



おわりに



議論された質問がhabrayuzerに圹立぀こずを願っおいたす。 たた、䞊蚘の質問にはこのような詳现な怜蚎が必芁であるずいう玠朎さを蚱しおください。しかし、やがお同様の蚘事が真剣に圹立぀でしょう。 蚘事には間違いがあるず確信しおいたす-コメントをお願いしたす。さらに、コメントの経隓豊富な仲間が実践からの質問を積極的に共有し、蚘事がhabrasocietyに奜意的に受け取られれば、Javaむンタビュヌの技術的な問題のレビュヌを続けるこずができるこずを願っおいたす。



PSちょっずした商業的関心新しい仕事の怜玢は継続されたす。もしhabrayuzersの1人が、開発や興味深いタスクに最新のアプロヌチをしおいる䌚瀟でJava開発者を怜玢しおいる堎合、たたは適切な空垭を詳しく調べるこずをお勧めするかもしれたせん-感謝したすPM。



All Articles