バイト側-リストとマップおよびセットの違い

金、銀、銀の季節がもうすぐ始まります。仕事を探すのに良い時期です。あなたはあなたの好きな高給の仕事を見つける機会をつかむ必要があります。仕事を探しているなら、面接なしではできません。これからは面接の質問をブラッシュアップして、何が欠けているのかを見つけましょう!

a93b1fa5df2849eeb6b196dcbd9496be.png


コンテンツ

⭐一般的なデータ構造⭐

⭐コレクションと配列の違い⭐

⭐リストとマップとセットの違い⭐

⭐リスト、マップ、実装クラスの設定⭐

⭐ハッシュマップの基本原則⭐

⭐ハッシュマップとハッシュテーブルの違いConcurrentHashMap⭐


e5d1c40d651e478cb774c66263c6c3bb.gif

 


⭐一般的なデータ構造⭐

 

一般的に使用されるデータ構造は、配列、スタック、キュー、リンクリスト、ツリー、ハッシュヒープ、グラフです。

a60a933402a34c5697e34bf1e7bfc19e.png

 

配列は最も一般的に使用されるデータ構造です。配列は固定長によって特徴付けられます。配列のサイズが固定されると、拡張できません。配列は1つのタイプのデータしか格納できません。他の理由により、追加と削除の操作は遅くなります。要素を移動する必要があります。

スタックは後入れ先出し(FILO)ベースのデータ構造であり、一方の端でのみ挿入および削除できる特別な線形リストです。ファーストイン、ラストアウトの原則に従ってデータを格納します。最初に入力されたデータはスタックの一番下にプッシュされ、最後のデータはスタックの一番上にあります。データを読み取る必要がある場合、データはからポップされます。スタックの最上位(最後のデータが最初に読み取られます)。

キューは、先入れ先出し(FIFO)に基づくデータ構造であり、一方の端でのみ挿入し、もう一方の端で削除できる特殊な線形テーブルであり、先入れ先出しの原則に従ってデータを格納します。 、先入れ先出し、および最初に入力されたデータは、データを読み取るときに最初に読み取られます。

リンクリストは、物理ストレージユニット上の非連続および非順次ストレージ構造です。その物理構造は、データ要素の論理順序を表すだけではありません。データ要素の論理順序は、リンク内のポインタのリンク順序によって実現されます。リスト。リンクリストは一連のノードで構成され(リンクリストの各要素はノードと呼ばれます)、ノードは実行時に動的に生成できます。ポインタによると、リンクリストは、単一リンクリスト、二重リンクリスト、循環リンクリストなどのさまざまな構造を形成できます。 

ツリーは、私たちのコンピューターにとって非常に重要なデータ構造です。同時に、ツリーのデータ構造を使用して、ファミリーツリー、ユニットの組織構造など、実生活で多くのことを記述することができます。二分木、バランスの取れた木、赤黒木、B木、B+木があります。

ハッシュテーブルは、ハッシュテーブルとも呼ばれ、キーコードと値(キーと値)に従って直接アクセスされるデータ構造であり、キーと値を介してコレクション内の位置にマップされるため、対応するコレクション内の対応はすぐに見つけることができる要素です。

ヒープは、コンピュータサイエンスにおける特殊な種類のデータ構造の総称であり、通常、完全な二分木の配列オブジェクトと見なすことができます。

グラフの定義:グラフは、2つの頂点を接続する一連の頂点と一連のエッジで構成されます。


⭐コレクションと配列の違い⭐

 

違い:配列の長さは固定され、コレクションの長さは可変です

配列は同じデータ型の要素を格納し、基本データ型または参照データ型を格納できます。
コレクションはオブジェクトを格納し、オブジェクトのデータ型は一貫していない可能性があります。開発では、オブジェクトが多数ある場合、コレクションは通常、オブジェクトを格納するために使用されます。


⭐リストとマップとセットの違い⭐

 

ListとSetは単一列のデータを格納するコレクションであり、Mapはキーと値のペアなどの二重列のデータを格納するコレクションです。

リストに保存されているデータ

マップに保存されているデータは順序付けられておらず、そのキーを複製することはできませんが、値を複製することはできます。

セットに格納されているデータは順序付けられておらず、繰り返しは許可されていませんが、セット内の要素の位置は要素のハッシュコードによって決定されます。つまり、位置は固定されています(セットコレクションはハッシュコードに従ってデータを格納します。したがって、位置は固定されていますが、この位置はユーザーが制御できないため、セット内の要素はユーザーにとって引き続き順序付けされていません)。


⭐リスト、マップ、実装クラスの設定⭐

 

(1)接続インターフェース
リストは順序付けられ、繰り返し可能です

ArrayList
の利点:基礎となるデータ構造は配列であり、クエリが高速で、追加と削除が低速です。
短所:スレッドセーフではなく、高効率
のベクター
長所:基になるデータ構造は、配列、高速クエリ、低速の加算と削除です。短所:スレッドセーフ、低効率、 LinkedList
が廃止されました長所:基になるデータ構造はリンクリストであり、クエリが遅く、追加と削除が高速です。短所:安全でないスレッド、高効率セット の乱れ、独特



HashSet
の基礎となるデータ構造は、ハッシュテーブルです。(順序付けされていない、一意)
要素の一意性を確保する方法?
hashCode()とequals()の2つのメソッドに依存します

LinkedHashSet
の基礎となるデータ構造は、リンクリストとハッシュテーブルです。(FIFO挿入順序、一意)
1.リンクリストにより、要素の順序が保証され
ます2.ハッシュテーブルにより、要素が一意になります

TreeSet
の基礎となるデータ構造は、赤黒木です。(一意、順序付け)
1.要素がソートされていることを確認する方法?
自然ソート
コンパレーターソート
2.要素の一意性を確認する方法?
比較の戻り値が0であるかどうかに応じて決定


(2)Mapインターフェースには、次の4つの実装クラスがあります。 

HashMap 
は、ハッシュテーブルのMapインターフェースの実装に基づいています。これは、スレッドセーフではなく、効率的であり、null値とnullキーをサポートし、スレッドセーフではありません。
HashTable 
はスレッドセーフで非効率的であり、null値とnullキーをサポートしていません 
。LinkedHashMap 
はスレッドセーフではなく、HashMapのサブクラスであり、レコードの挿入順序を保存します。

TreeMap

保存したレコードをキーに従って並べ替えることができます。デフォルトはキー値の昇順であり、スレッドセーフではありません。


⭐ハッシュマップの基本原則⭐

 

JDK1.8 配列+リンクリストの前のHashMapの実装、

ただし、JDK1.8以降、HashMapの基本的な最適化が実行され、 配列+リンクリストまたは数値+赤黒木によって実装されるように変更されました。主な目的は検索効率を向上させることです。

  1. Jdk8配列+リンクリストまたは配列+赤黒木実装。リンクリストの要素数が8を超えると、リンクリストは赤黒木に変換され、赤黒木ノードがまたは6に等しい場合、リンクリストに縮退します。
  2. new HashMap():最下層が配列を作成しない場合、put()メソッドが初めて呼び出されると、最下層は長さ16の配列を作成します。jdk8の最下層は次のとおりです。Node[] 、Entry []ではなく、配列のサイズに配列のサイズを掛けます。負荷率は値を取得します。配列に格納されている要素の数がこの値を超えると、rehashメソッドが呼び出されて配列の容量が2倍になります。専門用語は拡張と呼ばれます。拡張中に新しい配列が生成されます。元のすべてのデータはハッシュコード値を再計算して新しい配列に再配布する必要があるため、拡張操作は非常にパフォーマンスが高くなります。

デフォルトの負荷率サイズは0.75で、配列サイズは16です。つまり、デフォルトでは、HashMapの要素数が16 * 0.75 = 12を超えると、配列のサイズが2 * 16 = 32に拡張されます。つまり、2倍になります。

  1. 私たちのJavaでは、どのオブジェクトにもハッシュコードがあり、ハッシュアルゴリズムは、ハッシュコードを介して16を右にシフトするXOR演算を実行することです。これは、計算されたハッシュ値が十分にランダムで、十分に分散され、生成された配列の添え字が十分にランダムになるように行われます。

map.put(k、v)実装の原則

(1)最初にkとvをノードオブジェクト(ノード)にカプセル化します。
(2)最初にkのhashCode()メソッドを呼び出してハッシュ値を取得し、ハッシュアルゴリズムを使用して配列の添え字に変換します。
(3)添え字の位置に要素がない場合は、この位置にノードを追加します。下付き文字に対応する位置にリンクリストがある場合。この時点で、kとリンクリスト上の各ノードのkは等しくなります。すべてのequalsメソッドがfalseを返す場合、新しいノードがリストの最後に追加されます。等しいものの1つがtrueを返す場合、このノードの値は上書きされます。

map.get(k)の実装原理

(1)最初にkのhashCode()メソッドを呼び出してハッシュ値を取得し、ハッシュアルゴリズムを使用して配列の添え字に変換します。
(2)、配列の添え字を介して特定の位置にすばやく配置します。この位置に何もない場合は、nullを返すことを理解することが重要です。この位置に単一リンクリストがある場合、パラメータKと単一リンクリストの各ノードのKがequalsになります。すべてのequalsメソッドがfalseを返す場合、getメソッドはnullを返します。いずれかのノードのKとパラメーターKの等しい値がtrueを返す場合、ノードの値は探している値であり、getメソッドは最終的に探している値を返します。


  1. ハッシュの競合
    異なるオブジェクトによって計算された配列の添え字が同じであるため、ハッシュの競合が発生します。単一行のチェーンが特定の長さで表現されると、効率が非常に低くなります。
  2. リンクリストの長さが8より大きい場合、クエリの効率を向上させるために、リンクリストは赤黒木に変わります。


⭐ハッシュマップとハッシュテーブルの違いConcurrentHashMap⭐

 

1. HashMapはスレッドセーフではなく、HashTableはスレッドセーフです。

2. HashMapのキーと値はnull値を持つことが許可されていますが、HashTableは許可されていません。

3.スレッドセーフのため、HashMapはHashTableよりも効率的です。

4. Hashtableは同期的ですが、HashMapは同期的ではありません。したがって、HashMapは単一行に適しています

プロセス環境であり、Hashtableはマルチスレッド環境に適しています。現在、HashTableの使用は一般的に推奨されていません。①

HashTableはレガシークラスであり、最適化されておらず冗長性のない多くの内部実装があります。②マルチスレッド環境でも、

現在、同期ConcurrentHashMapの代替手段もあります。マルチスレッドであるため、使用する必要はありません。

ハッシュ表。


HashTableは同期されたキーワード変更を使用します。ConcurrentHashMapはJDK1.7であり、スレッドの安全性を確保するためにロックセグメンテーションテクノロジーを使用しています。JDK1.8 ConcurrentHashMapは、セグメントセグメントのロックをキャンセルし、CASを使用して同期し、同時実行の安全性を確保します。データ構造は、HashMap1.8、配列+リンクリスト/赤黒二分木と同様です。

Synchronizedは、ハッシュが競合しない限り、現在のリンクリストまたは赤黒二分木の最初のノードのみをロックします。同時実行性はなく、効率はN倍向上します。


1f598e4acb0d481a9f7e2ae70422053f.gif


 

おすすめ

転載: blog.csdn.net/weixin_42306958/article/details/123079535