このjavaコレクションフレームワークのインタビューの質問では、インタビュアーを簡単に取得できます。

ここにカタログタイトルを書く

コレクションフレーム

1.ArrayListとVectorの違い。

両方のクラスはリストインターフェイスを実装し(コレクションリストインターフェイスはインターフェイスを拡張します)、
エンゲージメントの順序付きセットです。つまり、これら2つの要素の位置はコレクションに格納され、動的に対応します。配列I
は後で要素インデックスによって位置を引き出すことができ、データの繰り返しが許可されます。これは
、HashSetなどの異なるセットで最大になります。HashSetインデックス番号を設定して
を取得することはできません。の要素も重複する要素を持つことはできません(元の質問はハッシュセットとは関係ありませんが、
ArrayListとVectorの機能明確にするために、問題の説明に役立つコントラストメソッドを使用します)。次に
、たとえばArrayListとVectorの唯一の違いは、2つの側面を含みます。
同期
Vectorはスレッドセーフです。つまり、そのメソッドはスレッド同期されますが、ArrayListはスレッドセーフではなく
、そのメソッドはスレッド同期されません。コレクションにアクセスできるスレッドが1つだけの場合は
、スレッドの安全性を考慮せず、効率が高くなるため、ArrayListを使用するの最適です。
コレクションにアクセスするスレッドが複数ある場合は、自分自身を必要としないため、Vectorを使用するのが最適です。次に、スレッドセーフな
コードを検討して記述します
備考:Vector&ArrayList、Hashtable&HashMapの場合、スレッドの安全性の問題に注意して
ください。VectorとHashtableは古く、javaによって提供されていることに注意してください。これらはスレッドセーフ
です。ArrayListとHashMapは、java2の場合にのみ提供されます。スレッドセーフではありません。だから私は
最初に古いものについて話しましょう。
データの増加
ArrayListとVectorには初期容量サイズがあります。それらに格納される要素の数が
容量を超える場合、ArrayListとVectorのストレージスペースを増やす必要があります
。ストレージユニットを追加しますが、複数のストレージユニットを追加すると、ストレージユニットの数が増えるたび
に、メモリスペースの使用率とプログラムの効率が向上し、一定のバランスが得られます。Vectorのデフォルトの成長は元の2倍であり
、ArrayListの成長戦略はドキュメントで明確に指定されていません(ソースコードから、成長は元の1.5
倍です)。ArrayListとVectorの両方で初期スペースサイズ
を設定できます。Vectorは拡張スペースサイズも設定できますが、ArrayListは拡張スペースを設定するメソッドを提供していません。
概要:つまり、Vectorは元の2倍になり、ArrayListは元の0.5倍になります。

2. ArrayList、Vector、LinkedListのストレージパフォーマンスと特性について話します。

ArrayListとVectorはどちらも配列を使用してデータを格納します。この配列の要素数は、要素
を追加および挿入するために格納されている実際のデータよりも多くなります。どちらもシーケンス番号による要素の直接インデックス付けが可能ですが、要素の挿入には配列
要素の移動などのメモリ操作が含まれるため、インデックス付けが行われます。データは高速ですが、データの挿入には時間がかかります。Vectorは
同期方式(スレッドの安全性)を使用します。
ArrayListのパフォーマンスの違いは通常より大きく、二重リンクリストを使用して実装されたLinkedListが保存され、シリアル番号でインデックスが付けられ
ます。データの数は前後に移動する必要がありますが、このレコードがデータアイテムを挿入できる前後にのみ
、より高速に挿入されます。 。
ArrayListは検索時に高速であり、LinkedListには挿入および削除時に利点があります。

3.フェイルファストとフェイルセーフの違いは何ですか?

Iteratorの安全上の失敗は、基になるコレクションのコピーに基づいているため、ソースコレクションの変更による影響を受けません。
java.utilパッケージのすべてのコレクションクラスは高速で失敗しますが、java.util.concurrentパッケージの
すべてのクラスは安全に失敗します。高速で失敗する
イテレーターはConcurrentModificationExceptionをスローしますが、安全に失敗するイテレーターはそのような
例外をスローしません

4.ハッシュマップのデータ構造。

Javaプログラミング言語には、2つの基本構造があります。1つは配列で、もう1つはアナログポインタ
(参照)です。すべてのデータ構造は、これら2つの基本構造を使用して構築でき、ハッシュマップも
例外ではありませんハッシュマップは、実際には配列とリンクリストの組み合わせです(データ構造では、一般に「リンク
リストハッシュ」と呼ばれます)
ここに画像の説明を入力します

5. HashMapの動作原理は何ですか?

JavaのHashMapは、要素をキーと値のペアの形式で格納します。HashMapには
、hashCode()メソッドとequals()メソッドを使用して、コレクションとの間で
要素を追加および取得するハッシュ関数が必要です。put()メソッドが呼び出されると、HashMapはキーのハッシュ値を計算
し、コレクション内の適切なインデックスにキーと値のペアを格納ます。キーがすでに存在する場合、値は新しい値に更新されます。
HashMapのいくつかの重要な特性は、その容量、負荷率、および
しきい値のサイズ変更です。

6. Hashmapはいつ拡張されますか?

ハッシュマップの要素数が配列サイズloadFactorを超えると、配列が展開
されます
。loadFactorのデフォルト値は0.75、つまりデフォルトでは配列サイズは16であるため、ハッシュマップの要素数が160.75 = 12を超えると拡張配列のサイズを216 = 32にすると、
つまり2倍になり、配列内の各要素の位置が再計算されます。これは、パフォーマンスを消費する操作である
ため、要素のハッシュマップを予測した場合プリセット要素の数は
、ハッシュマップのパフォーマンスを効果的に向上させることができます。たとえば、1000個の要素の新しいHashMap(1000)があります
が、理論的には新しいHashMap(1024)の方が適していますが、上記のannegu
は、1000であっても、ハッシュマップによって自動的に1024に設定されます。ただし、新しいHashMap(1024)は
適切ではありません。これは、0.75 * 1000 <1000、つまり、0.75 *サイズ> 1000に
するために、&との問題を考慮して、この方法で新しいHashMap(2048)を使用する必要があるためです。サイズ変更の
問題を回避します。

7.要素にアクセスするときのList、Map、およびSetの3つのインターフェイスの特徴は何ですか?

このような質問はフリープレイの質問です。これらの質問はテストレベルを比較し、2つのレベルがあります。1つは
コンテンツを真に理解することであり、もう1つは強力な要約と表示能力を持つことです。理解していても表現がはっきり
しない場合は、他人に理解していないのと同じです。
まず、ListとSetは似ていますが、どちらも単一列の要素のコレクションであるため、
Collectionと呼ばれる共通の親インターフェイスがあります。Setでは要素の重複は許可されていません。いわゆる重複とは、
等しい2つのオブジェクトが存在できないことを意味します(同じではないことに注意してください)。つまり、
SetコレクションにAオブジェクトがあるとします。次に、別のオブジェクトをSetコレクションに格納します。 Bオブジェクトですが、BオブジェクトとAオブジェクトが等しい場合、B
オブジェクトを保存できません。したがって、Setコレクションのaddメソッドにはブール値の戻り値があります。コレクション
に要素ない場合、addメソッドは正常に結合できます。要素が要素の場合、trueを返します。セットに特定の
要素が等しいに等しい要素が含まれている場合、addメソッドはこの時点で要素を追加できず、戻り結果はfalseになります。
Setで要素を取得する場合、どの番号を取得するかを指定する方法はありません。すべての要素をIteratorインターフェイスから取得し、
各要素を1つずつトラバースすることしかできません
リストはシーケンシャルコレクションを表します。年齢、サイズ、価格などで並べ替えられていないことに注意してください。
add(Obj e)メソッドを複数回呼び出すと、駅にチケットを購入するためのキューがあるの
同じように、毎回追加されるオブジェクトが先着順で並べ替えられます場合によっては、キューにジャンプすることもできます。つまり、add(int index、Obj e)
メソッドを呼び出して、コレクション内の現在のオブジェクトの保存場所を指定することもできます。オブジェクトはリストに繰り返し保存できます。
addメソッドが呼び出されるたびに、オブジェクトはコレクションに1回挿入されます。実際、オブジェクト
自体はコレクションに格納されませんが、インデックス変数はコレクション内のオブジェクトを指すために使用されます。オブジェクトが
複数回追加される場合の場合、図xに示すように、コレクション内のこのオブジェクトを指す複数のインデックスがあることを意味します。
Iteratorインターフェイスを介してListのすべての要素を取得し、各要素を1つずつトラバースすることに加えて、
get(index i)を呼び出して、取得する番号を指定することもできます。
MapはListおよびSetとは異なり、2つの列のコレクションです。次のように定義されるputメソッドがあります:
put(obj key、obj value)、キーと値のペアが保存されるたびに、重複する
キーを保存することはできません。この繰り返されるルールは、equalsに従ってequalsも比較します。キーに従って対応する
値を取得します。つまり、get(Object key)の戻り値は、キーに対応する値です。さらに、すべての
キーの組み合わせ、すべての値の組み合わせ、およびキーと値で構成される
Map.Entryオブジェクトのコレクションを取得することもできます
リストは特定の順序で要素を保持し、重複する要素を持つことができます。セットに重複する要素、内部ソートを含めることはできません。
マップはキー値の値を格納し、値は複数の値にすることができます。
HashSetは
hashCode値のサイズに直接応じてでなく、hashcode値の特定の計算方法に従って格納されます。たとえば、「abc」—> 78、「def」—> 62、「xyz」—> 65 in
hashSetの保存順序は62、65、78ではありません。これらの質問を提起したCui Jianという前の学生に感謝します。
最後、ソースコードを見て、彼に明確に説明しました。何人の研修生がソースコードを理解できるかを確認してください。
LinkedHashSetは挿入順に保存されます
保存されたオブジェクトのハッシュコードメソッドの目的は何ですか?学生はそれについて考えます!ハッシュセットセットは、2つのオブジェクトが等しいかどうかを比較し、最初にハッシュコードメソッドが
等しいかどうかを確認し、次にequalsメソッドが等しいかどうかを確認します。2人の新しい学生をHashSetに挿入し、HashSet
のサイズを確認し、hashcodeおよびequalsメソッドを実装した後のサイズを確認します。
同じオブジェクトをVectorに複数回追加できます。コレクションに要素を追加することは
、ターゲットオブジェクトをコレクション内のロープで接続することと同じです。HashSetに何度も追加することはできません。

8.セット内の要素は繰り返すことができないので、繰り返されるかどうかを区別するためにどのような方法が使用されますか?==またはを使用するのですか?

equals()?それらの違いは何ですか?
セット内の要素を繰り返すことはできません要素が繰り返されるかどうかは、equals()メソッドによって判断されます。
equals()メソッドと==メソッド
は、2つの別々のオブジェクトのコンテンツとタイプが一致したときに真の値を返すため、参照値が同じオブジェクトequals()を指しているかどうかをクラスでオーバーライドするかどうかを決定します。

9. 2つのオブジェクトの値は同じですが(x.equals(y)== true)、異なるハッシュコードを持つことができます。この文は正しいですか?

正しい。オブジェクトがHashSetまたはHashMapに格納され、それらの等しい値が等しい場合、
それらのハッシュコード値は等しくなければなりません。
HashSetまたはHashMapに保持されない場合は、ハッシュコードとは関係がなく、
待機中のハッシュコード範囲が可能です。たとえば、arrayListに格納されたオブジェクトのハッシュコードは
、もちろん、達成しない理由がない場合、通常は達成します。の。

10.ヒープとスタックの違いは何ですか。

Javaメモリは2つのカテゴリに分けられます。1つはスタックメモリで、もう1つはヒープメモリです。スタックメモリとは
プログラムがメソッド入ると、メソッド内にローカル変数を格納するために、このメソッドにプライベートストレージスペースの一部が割り当てられることを意味します。
メソッドが終了すると、このメソッドに割り当てられたスタックが解放されます。それに応じて変数が解放されます。
ヒープはスタックとは別のメモリです。通常、現在のメソッドスタックに配置されていないデータを格納するために使用されます。たとえば、
newで作成されたオブジェクトはヒープに配置されるため、メソッドの終了時に消えることはありません。メソッド内のローカル
変数finalで変更された後、それらはスタックではなくヒープに配置されます。

11. Javaコレクションフレームワークの基本的なインターフェイスは何ですか?

コレクションインターフェイスは、要素と呼ばれるオブジェクトのセットを指定します。コレクションクラスインターフェイスの特定の実装クラスはそれぞれ
、独自の方法で要素を格納および並べ替えることを選択できます。一部のコレクションクラスは重複キーを許可しますが、許可しないものもあります。
Javaコレクションクラスは、一連のオブジェクトに対する操作をサポートする、適切に設計された一連のインターフェイスとクラスを提供します。Javaコレクション
クラス最も基本的なインターフェイスは次のとおりです。
コレクション:オブジェクトのグループを表し、各オブジェクトはその子要素です。
セット:繰り返される要素を含まないコレクション。
リスト:順序付けられたコレクションであり、繰り返される要素を含めることができます。
マップ:キーを値にマップでき、キーを繰り返すことができないオブジェクト。

12. HashSetとTreeSetの違いは何ですか?

HashSetはハッシュテーブルによって実装されるため、その要素は順序付けられていません。add()、
remove()、contains()
TreeSetはツリー構造によって実装され、その中の要素は順序付けられます。したがって、add()、
remove()、contains()メソッドの時間の複雑さはO(logn)です。

13. HashSetの基本的な実装は何ですか?

ソースコードを見ると、HashSetの実装はHashMapに依存しており、HashSetの値は
HashMapに格納さていることがわかります。HashSetの構築では、HashMapオブジェクトが初期化されます
。HashSetは重複値を許可しないため、HashSetの値は
HashMapのキーとしてHashMapに格納され、格納された値がすでに存在する場合はfalseが返されます。

14. LinkedHashMapはどのように機能しますか?

LinkedHashMapもHashMapに基づいて実装されます。違いは、Entry
ヘッダーを定義することです。このヘッダーはテーブルに配置されず、さらに独立しています。
LinkedHashMapは、hashMapのEntryを継承し、2つの属性Entry
before、after、headerを追加して結合し、二重リンクリストを形成して、挿入順序またはアクセス順序による
並べ替えを実現しますLinkedHashMapは、ブール変数であるソートモードaccessOrderを定義します
。アクセス順序の場合はtrue、挿入順序の場合はfalseです。通常、
ソートモードを指定する必要はなく、その反復順序はデフォルトでは挿入順序です。

15.コレクションクラスがCloneableおよびSerializableインターフェイスを実装しないのはなぜですか?

クローニングまたはシリアル化のセマンティクスと意味は、特定の実装に関連しています。
したがって、コレクションクラスの特定の実装によって、クローン化またはシリアル化の方法を決定する必要があります。

16.イテレーターとは何ですか?

Iteratorインターフェースは、コレクション要素を反復処理するための多くのメソッドを提供します。各コレクションクラスには、
イテレーターインスタンスを返すことができるイテレーションメソッドが含まれています。イテレーターは、反復プロセス中に基になるコレクションの要素を削除できますが、コレクション
のremove(Object Obj)を直接呼び出して削除することはできません
イテレーターのremove()メソッドを使用して削除できます

17. IteratorとListIteratorの違いは何ですか?

違いを以下に示します
。IteratorはSetコレクションとListコレクションをトラバースするために使用できますが、ListIteratorはListをトラバースするためにのみ使用できます。
Iteratorはコレクションを前方にのみトラバースでき、ListIteratorは前方と後方の両方にトラバースできます。
ListIteratorは、Iteratorインターフェイスを実装し、要素の追加、要素の置換
、前の要素と次の要素のインデックスの取得などの他の機能を含みます

18. ArrayとArrayListの違いは何ですか?いつアレイの代わりにアレイを使用する必要がありますか

配列リスト?
Arrayには基本タイプとオブジェクトタイプを含めることができ、ArrayListにはオブジェクトタイプのみを含めることができます。
Arrayのサイズは固定されており、ArrayListのサイズは動的に変化します。
ArrayListが固定サイズの基本データタイプを処理する場合、このメソッドは比較的低速です。

19. Javaコレクションフレームワークのベストプラクティスは何ですか?

要素のサイズが固定されており、事前にわかっている場合は、ArrayListの代わりにArrayを使用する必要があります。
一部のコレクションクラスでは、初期容量を指定できます。したがって、格納されている要素の数を見積もることができれば、ハッシュ値の再計算や容量の拡張を回避するために初期容量を設定できます。タイプの安全性のために、ジェネリックは常に読みやすさと堅牢性の理由で使用されます。同時に、ジェネリックを使用すると、実行時にClassCastExceptionを回避することもできます。マップのキーとしてJDKによって提供される不変クラスを使用すると、独自のクラスにhashCode()およびequals()メソッドを実装することを回避できます。
プログラミング時には、インターフェイスは実装よりも優れています。
基になるコレクションが実際に空の場合は、nullではなく長さ0のコレクションまたは配列を返します。

20.セット内の要素は繰り返すことができないので、繰り返されるかどうかを区別するためにどのような方法が使用されますか?==またはequals()を使用する必要がありますか?それらの違いは何ですか?

セット内の要素は繰り返すことができないため、iterator()メソッドを使用して繰り返されるかどうかを区別します。equals()は、
2つのセットが等しいかどうか判別します
。equals()および==メソッドは、参照値が同じオブジェクトを指しているかどうかを判別します。equals()は、クラス内でオーバーライドされるため
、2つの別々のオブジェクトのコンテンツとタイプが一致する場合真の値を返します
## 21。ComparableおよびComparatorインターフェースは何をしますか?それらの違いをリストします。
Javaは、compareTo()メソッドのみを含むComparableインターフェイスを提供します。このメソッドは、
2つのオブジェクトを個別にソートできます。具体的には、負の数、0、および正の数を返し、入力オブジェクトが
既存のオブジェクトよりも小さい、等しい、または大きいことを示します。
Javaは、Compare()およびequals()Comparatorインターフェースを提供します。
compare()メソッドを使用して、2つの入力パラメーターをソートし、負の数0と、最初のパラメーターが
2番目のパラメーターよりも小さい、等しい、大きいことを示す正の数を返します。equals()メソッドは、入力
パラメーターがコンパレーターと等しいかどうかを判別するために使用されるパラメーターとしてオブジェクトを必要とします
このメソッドは、入力パラメーターがコンパレーターでもあり、入力パラメーターが現在のコンパレーターのソート結果と同じである場合にのみtrueを返します。

22.コレクションとコレクションの違い。

コレクションは、コレクションクラスの優れたインターフェイスです。継承とそのインターフェイスは、主に設定および一覧表示されます。
コレクションクラスは、コレクションクラスのヘルパークラスであり、さまざまなコレクションの検索
、並べ替え、およびスレッド安全操作のための一連の静的メソッドを提供します

おすすめ

転載: blog.csdn.net/Java_Yhua/article/details/110988646