この記事は、主にあなたの参考のために一般的なJavaインタビューの質問を展開しています。特定のコンテンツは次のとおりです
1.睡眠とJavaでの待機の違い
classeさまざまなクラスからのこれらの2つの方法は、スレッドクラスからの睡眠は、オブジェクトクラスから来ています。
睡眠は、静的クラスのスレッド方法です。それを呼ぶ人は誰でも眠りにつく。 Bの睡眠方法がスレッドAで呼び出されたとしても、実際にはまだ眠りについています。スレッドBを睡眠にするには、bのコードで睡眠を呼び出す必要があります。
②ロック:最も重要なことは、睡眠方法がロックを放出しないこと、待機方法がロックを解放し、他のスレッドが同期制御ブロックまたはメソッドを使用できるようにすることです。
睡眠はシステムリソースを転送しません。待機するのは、待機中のプールに入り、システムリソースを転送し、他のスレッドがCPUを占めることができます。一般的に、待機スレッドが不十分なリソースで実行された場合、再び出てくるのは役に立たないため、時間制限は追加されません。他のスレッドがNotify/NotifyAllを呼び出して、準備が整ったキューに入り、OSがシステムリソースを割り当てるのを待つ前に、待機プールのすべてのスレッドを起動するのを待つ必要があります。睡眠(ミリ秒)を指定して、自動的に目覚めさせることができます。時間が短い場合は、割り込み()のみを呼び出して割り込みを強制することができます。
Thread.Sleep(0)の機能は、「オペレーティングシステムをトリガーしてCPUを再び再競争させる」ことです。
cope使用範囲:待機、通知、およびNotifyAllは、同期制御方法または同期制御ブロックでのみ使用できますが、睡眠はどこでも使用できます。
同期(x){x.notify()//またはwait()}2。JavaのHashmapとHashtableの違い
histrucy歴史的理由:ハッシュテーブルは古いディクトンクラスに与えられます。 HashMapは、Java 1.2によって導入されたMAPインターフェイスの実装です。
hashmapは空のキー価値のペアを許可しますが、ハッシュテーブルは
Hashtable同期、ハッシュマップ非同期はハッシュテーブルよりも効率的です
3。例外のスローとスローの違いを簡単に説明してください
①スローはアクションを表します。つまり、例外がスローされます。スローは状態を表します。つまり、メソッドは例外がスローされている可能性があることを意味します②スローはメソッド実装で使用されますが、スローはメソッド宣言で使用されます③スローは1つの例外をスローするためにのみ使用できますが、スローは複数の例外をスローできます。
4.メモリオーバーフローとメモリの漏れの違い
メモリからのメモリオーバーフローは、プログラムがメモリに適用されると、使用するのに十分なメモリ領域がなく、メモリ外に表示されるという事実を指します。たとえば、整数が適用されますが、長く節約できる場合、メモリオーバーフローです。
メモリリークメモリリークとは、メモリを申請した後に適用されたメモリスペースを解放できないプログラムができないことを指します。メモリリークの害は無視できますが、メモリリークの蓄積の結果は非常に深刻です。どれだけのメモリがあっても、それは遅かれ早かれ占有されます。
メモリリークは最終的にメモリから外れます!
メモリオーバーフローとは、割り当てに必要なメモリがシステムが提供できるものを超え、システムがニーズを満たすことができないため、オーバーフローが発生することを意味します。
メモリリークは、使用するためにメモリを割り当てるためにシステムに適用するときですが、使用後は戻りません(削除)。その結果、適用したメモリにアクセスできなくなり(住所を紛失した可能性があります)、システムはそれを必要なプログラムに再度割り当てることができません。すべての方法を使用してプレートを埋める場合、4つの果物のみを保持できます。 5を埋めると、地面に落ちて食べることができません。これはオーバーフローです!たとえば、スタックがいっぱいの場合、スタックがいっぱいになったときにスペースオーバーフローを必然的に引き起こします。これはオーバーフローと呼ばれます。スタックが空の場合、スタックが空になるとスペースオーバーフローも発生します。これはUnderflowと呼ばれます。つまり、割り当てられたメモリは、メモリオーバーフローと呼ばれるデータ項目のシーケンスを下げるのに十分ではないことを意味します。
分類が発生する方法で、メモリリークは4つのカテゴリに分けることができます。
creve頻繁なメモリが漏れます。メモリリークで発生するコードは複数回実行され、実行されるたびにメモリが漏れます。
acceente Memory Leak。メモリリークで発生するコードは、特定の特定の環境または操作でのみ発生します。定期的で時折は相対的です。特定の環境では、時折性が頻繁になる可能性があります。したがって、テスト環境とテスト方法は、メモリリークを検出するために重要です。
③1回限りのメモリリーク。メモリリークで発生するコードは、1回しか実行されないか、アルゴリズムの欠陥のために、常に1つのメモリリークのみがあります。たとえば、メモリはクラスのコンストラクターに割り当てられますが、メモリはデストラクタで放出されないため、メモリリークは1回しか発生しません。
④暗黙のメモリリーク。このプログラムは、操作中にメモリを継続的に割り当てますが、メモリが終了するまでメモリを放出しません。厳密に言えば、プログラムが最終的にすべての要求されたメモリを解放するため、ここにはメモリリークはありません。しかし、サーバープログラムの場合、実行には数日、数週間、さらには数か月かかり、時間内にメモリを解放しないことは、システム内のすべてのメモリを使い果たすことにつながる可能性があります。したがって、このタイプのメモリリークを暗黙のメモリリークと呼びます。
プログラムを使用しているユーザーの観点から見ると、メモリリーク自体は害を引き起こしません。普通のユーザーとして、メモリリークの存在をまったく感じることはできません。本当に有害なのは、メモリリークの蓄積であり、最終的にシステム内のすべてのメモリを消費します。この観点から見ると、一度限りのメモリリークは蓄積しないため有害ではありませんが、暗黙のメモリリークは、頻繁で時折メモリ漏れよりも検出が困難であるため、非常に有害です。
5。文字列、stringbuffer、stringbuilderの違い
varvariable可変で不変
文字列クラスは、文字列を使用して文字列を保存します。次のように:「最終」モディファイアがあるため、文字列オブジェクトが不変であることがわかります。
プライベートファイナルチャーバリュー[];
StringBuilderとStringBufferの両方が、AbstractStringBuilderクラスから継承されます。 AbstractStringBuilderでは、文字列を保存するために文字配列が使用されます。次のように、両方のオブジェクトが可変であることがわかります。
char [] value;
multi-multi-threadedと安全です
文字列内のオブジェクトは不変であるため、定数として理解できます。これは明らかにスレッドセーフです。
AbstractStringBuilderは、StringBuilderとStringBufferのパブリック親クラスであり、拡張性、追加、挿入、IndexOF、その他のパブリックメソッドなどの文字列の基本操作を定義します。
StringBufferには、メソッドに同期ロックがあり、呼び出されたメソッドに同期ロックがあるため、スレッドセーフです。次のソースコードを参照してください。
public synchronized stringbuffer Reverse(){super.Reverse();これを返します。 } public int indexof(string str){return indexof(str、0); // public Synchronized ind indexof(string str、int fromindex)メソッドがあります} StringBuilderはこのメソッドに同期ロックを追加しないため、非読み取りセーフです。
stringbuilderとstringbufferの共通
StringBuilderとStringBufferには、パブリック親クラスAbstractStringBuilder(要約クラス)があります。
抽象クラスとインターフェイスの違いの1つは、サブクラスの公開方法を抽象クラスで定義できることです。サブクラスは、新しい機能を追加するだけで、既存のメソッドを繰り返す必要はありません。一方、インターフェイスはメソッドと定数のみを定義します。
StringBuilderとStringBufferの方法は、super.append(...)などの抽象ストリングビルダーのパブリックメソッドを呼び出します。 StringBufferがメソッドに同期されたキーワードを追加し、同期を実行するだけです。
最後に、プログラムがマルチスレッドでない場合、StringBuilderの使用はStringBufferよりも効率的です。
6.配列とリンクリストの違い
どちらもデータ構造に属します
論理構造から:
Arrayアレイは、固定長(要素の数)を事前に定義する必要があり、データの動的な増加と減少に適応することはできません。データが増加すると、要素の数が最初に定義されたものを超える可能性があります。データが減少すると、メモリ廃棄物が引き起こされます。アレイは、添え字に従って直接アクセスできます。
relinkリンクされたリストは動的に保存され、割り当てられます。これにより、データの動的増加と減少に適応でき、データ項目を簡単に挿入および削除できます。 (配列にデータ項目を挿入して削除する場合、他のデータ項目を移動する必要があります。これは非常に面倒です)リンクリストは、次のポインターに従って次の要素を見つける必要があります。
メモリストレージから:
①(静的)配列は、プログラマーにとって便利で高速なスタックからスペースを割り当てますが、自由はほとんどありません。
Linkedリンクリストは、多くの自由があるが、管理に応募するのが面倒なヒープからスペースを割り当てます。
上記の比較から、データにすばやくアクセスし、めったに要素を挿入して削除しない場合は、配列を使用する必要があることがわかります。それどころか、要素を頻繁に挿入して削除する必要がある場合は、リンクされたリストデータ構造を使用する必要があります。
7. ArrayListとLinkedListの違い
ArrayListは、動的配列に基づいてデータ構造を実装し、LinkedListはリンクリストに基づいたデータ構造に基づいています。
LinkedListがポインターを移動する必要があるため、ArrayListがLinkedListよりも優れているため、ランダムアクセスを取得および設定するには、ArrayListが気分が良くなります。
Ardidedと削除操作の追加および削除の削除には、ArrayListがデータを移動する必要があるため、LinedListには比較的利点があります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。