インタビュアーはコアライブラリについて何を尋ねますか?

ここに画像の説明を挿入

ArrayとArrayListの違いは何ですか?

配列には基本型とオブジェクト型を含めることができ、ArrayListにはオブジェクト型のみを含めることができます。配列配列は、格納されるときに同じタイプの要素である必要があります。ArrayListはObjectを格納できるため、必ずしもそうとは限りません。
Arrayのサイズは固定されており、ArrayListのサイズは動的に変化します。
ArrayListは、addAll()、removeAll()、iterator()などのより多くのメソッドと機能を提供します。
基本的なタイプのデータの場合、コレクションは自動ボクシングを使用してコーディングの作業負荷を軽減します。ただし、この方法は、固定サイズの基本データ型を処理する場合は比較的低速です。

プログラムの実行中に存在し、変更されないままのデータを保存する場合は、それらをグローバル配列に配置できますが、データに操作を追加せずに、データを配列の形式で保存するだけの場合は、 、など。検索するのが便利なので、ArrayListを選択します。また、もう1つ知っておくべきことがあります。つまり、要素を頻繁に移動または削除したり、大量のデータを処理したりする必要がある場合、ArrayListを使用することは、効率が高いため、実際には適切ではありません。このようなアクションに配列を使用するのは非常に面倒なので、LinkedListの選択を検討できます。

ArrayListとVectorの違いは何ですか?

Vectorクラスのすべてのメソッドが同期されます。2つのスレッドが同じVectorオブジェクトに安全にアクセスできます。ただし、1つのスレッドがVectorにアクセスすると、同期操作に多くの時間がかかります。
Vectorはスレッド(スレッド)同期(同期)されているため、スレッドセーフでもありますが、Arraylistはスレッド非同期(ASynchronized)であり、安全ではありません。スレッドセーフが考慮されていない場合は、通常、Arraylistの方が効率的です。
ArrayListと同様に、Vectorも配列を介して実装されます。違いは、スレッドの同期をサポートすることです。つまり、一度に1つのスレッドのみがVectorを書き込むことができ、複数のスレッドが同時に書き込むことによって引き起こされる不整合を回避しますが、同期には高い必要があります。コストしたがって、それにアクセスすることは、ArrayListにアクセスするよりも遅くなります。

HashMap、TreeMap、HashTableの違いは何ですか?

ブログ投稿の
Hashtable、HashMap、およびTreeMapはすべて、キーと値のペアを使用してデータを格納および操作するMapインターフェイスを実装しています。
ハッシュテーブルはJavaによって早期に提供され、メソッドは同期されます(同期が追加されます)。キーも値もnull値にすることはできません。
HashMapのメソッドは同期的ではなく、キーと値がnullの場合をサポートします。動作は基本的にHashtableと同じです。Hashtableは同期的であるため、パフォーマンスオーバーヘッドが比較的大きく、通常、Hashtableの使用はお勧めしません。通常、HashMapの使用を選択します。
putおよびget操作のHashMapは、基本的に一定の時間パフォーマンスを実現できます
。TreeMapは、シーケンシャルアクセスを提供する赤黒木に基づくマップです。HashMapとは異なり、getまたはput操作の時間の複雑さはO(log(n))です。特定の順序は、指定されたコンパレータによって、またはキーの特定の順序に従って決定されます。

HashMapはどのように機能しますか?

小さな波ボーエン
ボーエン
ハッシュマップデータ構造は、アレイは、構造jdk1.8前にリンクされたリストを追加することによって達成され、キーのキーと値のペアであり、jdk1.8は赤黒木を追加し、アレイのデフォルトの初期長さは、ハッシュマップ16でありますハッシュマップ配列では、1つのキーのみをnullにすることができ、複数の値をnullにすることができます

ハッシュマップの内部実装であるハッシュマップは、配列+リンクリスト+赤黒木という形式で実装されます。配列はNode []配列であり、キーと値のキーと値のペアを格納するハッシュバケット配列と呼ばれます。ノードの。HashMapはハッシュテーブルに格納されます。ハッシュマップ内のハッシュの競合を解決するために、チェーンアドレス方式が使用されます。これは単純に配列とリンクリストです。データがハッシュされると、配列の添え字が取得され、データが取得されます。次の表のリンクリストの対応するに配置されます。
シリアル化は、オブジェクトの状態情報を保存または送信できる形式に変換するプロセスです。シリアル化中に、オブジェクトは現在の状態を一時ストレージまたは永続ストレージに書き込みます。後で、ストレージ領域からオブジェクトの状態を読み取るか逆シリアル化することにより、オブジェクトを再作成できます。

シリアル化とは何ですか?シリアル化を実現する方法は?

シリアル化により、他のコードは、シリアル化なしではアクセスできないオブジェクトインスタンスデータを表示または変更できます。正確には、コード実行のシリアル化には特別なアクセス許可が必要です。SerializationFormatterフラグが指定されたSecurityPermissionです。デフォルトのポリシーでは、インターネット経由でダウンロードされたコードまたはインターネットコードはこのアクセス許可を付与せず、ローカルコンピューター上のコードのみがこのアクセス許可を付与されます。

通常、オブジェクトインスタンスのすべてのフィールドはシリアル化されます。つまり、データはインスタンスのシリアル化されたデータとして表されます。このように、フォーマットを解釈できるコードは、メンバーのアクセシビリティに依存することなく、これらのデータの値を決定できる可能性があります。同様に、逆シリアル化は、シリアル化された表現からデータを抽出し、オブジェクトの状態を直接設定します。これも、アクセシビリティルールとは関係ありません。

重要なセキュリティデータを含む可能性のあるオブジェクトについては、可能であれば、オブジェクトをシリアル化不可にする必要があります。シリアル化可能にする必要がある場合は、シリアル化できない重要なデータを保持するために特定のフィールドを生成してみてください。これが不可能な場合は、データがシリアル化権限を持つコードに公開されることに注意し、悪意のあるコードがこの権限を取得することを許可されていないことを確認する必要があります。

プロセスとスレッドの違いは何ですか?

•スケジューリング:スレッドを導入するオペレーティングシステムでは、スレッドはスケジューリングと割り当ての基本単位であり、プロセスはリソース所有権の基本単位です。従来のプロセスの2つの属性を分離することで、スレッドを軽く実行できるため、システムの同時実行性を大幅に向上させることができます。同じプロセスで、スレッドの切り替えによってプロセスの切り替えが発生することはありません。あるプロセスのスレッドが別のプロセスのスレッドに切り替えられた場合にのみ、プロセスの切り替えが発生します。

•同時実行性:スレッドを導入するオペレーティングシステムでは、プロセスを同時に実行できるだけでなく、プロセス内の複数のスレッド間でも実行できるため、オペレーティングシステムの同時実行性が向上し、システムリソースをより効果的に使用して改善できます。システムスループット。

•リソースの所有:従来のオペレーティングシステムであろうとスレッド付きのオペレーティングシステムであろうと、プロセスはリソースを所有する独立したユニットであり、独自のリソースを所有できます。一般的に、スレッド自体はシステムリソースを所有していません(一部の重要なリソースのみですが、下位プロセスのリソースにアクセスできます。

•システムオーバーヘッド:システムはプロセスの作成またはキャンセル時にリソースを割り当てまたは再利用するため、オペレーティングシステムは、スレッドの作成またはキャンセル時よりも大幅に多くのオーバーヘッドを支払います。プロセス切り替えのオーバーヘッドも、スレッド切り替えのオーバーヘッドよりもはるかに大きくなります。

•通信:プロセス間通信IPC、スレッドはプロセスデータセグメント(グローバル変数など)を直接読み書きして通信できます。データの一貫性を確保するには、プロセスの同期と相互排除手段が必要であるため、共有が簡単です。ただし、スレッドデータの同期はプロセスよりも少し複雑です。

Javaでスレッドを実装する方法は?

以前のブログ投稿で書いた:マルチスレッド戦略、
スレッドの継承、Runnableの実装

スレッドのライフサイクルについて話す

スレッドのライフサイクル状態の説明

新規:Javaでnewキーワードを使用して新しいスレッドを作成すると同時に、このスレッドにメモリを割り当て、一部のメンバー変数の値を初期化します。この時点で、スレッドは新しい状態になっています。

準備完了:新しく作成されたスレッドがstartメソッドを呼び出します。この時点で、JVMはスレッドプライベート仮想マシンスタック、ローカルメソッドスタック、およびプログラムカウンターを作成し、スレッドの状態が準備完了に変わります。

実行:準備完了状態のスレッドはCPUリソースを取得し、runメソッドで特定のビジネスロジックの実行を開始し、スレッドの状態が実行に変わります。

ブロッキング:実行中のスレッドはCPUを使用する権利を放棄し、その動作を一時停止します。このとき、スレッドはブロックされた状態になります。

停止:スレッドが正常に、異常に、または手動で終了した場合、スレッドは停止状態になります。
ここに画像の説明を挿入

マルチスレッドの同時実行性またはスレッドセーフの問題を解決する方法は?


マルチスレッドの同時実行性のセキュリティ問題解決するために、Javaはロックにすぎません。具体的には2つの方法です。

(1)同期(Javaに付属するキーワード)

(2)再入可能ロックのロック(再入可能ロック。このパッケージjava.util.concurrent.locksには、2つのインターフェースがあり、それぞれ2つのクラスに対応して、これら2つのインターフェースを実装します。

   (a)lock接口, 实现的类为:ReentrantLock类 可重入锁;

   (b)readwritelock接口,实现类为:ReentrantReadWriteLock 读写锁)

つまり、次の3つのタイプがあります。
(1)同期は相互排他ロックです。

(2)ReentrantLock、名前が示すように:リエントラントロック

(3)ReentrantReadWriteLock:読み取り/書き込みロック

これら2つの方法の最大の違いは、Synchronizedの場合、これはJava言語のキーワードであり、ネイティブ構文レベルでの相互排除であり、jvmで実装する必要があることです。ReentrantLockは、JDK 1.5の後に提供されるAPIレベルのミューテックスロックであり、完了するにはtry / finalステートメントブロックを持つlock()メソッドとunlock()メソッドが必要です。

同期とReentrantLockの違い

機能の違い

利便性:明らかに、Synchronizedの使用はより便利で簡潔であり、ロックがロックされて解放されることを確認するのはコンパイラーの責任です。ロックをロックして解放するには、ReenTrantLockを手動で宣言する必要があります。手動でロックを解除してデッドロックを発生させる場合は、最後にロックの解除を宣言するのが最善です。
きめ細かく柔軟なロック:明らかに、ReenTrantLockはSynchronizedよりも優れています

パフォーマンスの違い

同期最適化の前は、同期のパフォーマンスはReenTrantLockのパフォーマンスよりもはるかに劣っていましたが、同期ではバイアスロック、軽量ロック(スピンロック)が導入されたため、両方の方法を使用できる場合、2つのパフォーマンスはほぼ同じです。関係者は同期の使用を推奨しています。実際、同期の最適化はReenTrantLockのCASテクノロジーに基づいていると思います。彼らは皆、カーネルモードに入るスレッドをブロックしないように、ユーザーモードでのロックの問題を解決しようとしています。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/AzirBoDa/article/details/113785051