ホームページ  >  記事  >  Java  >  Java の面接での基本的な質問を共有する

Java の面接での基本的な質問を共有する

零下一度
零下一度オリジナル
2017-06-23 09:30:431372ブラウズ

1.データの保存場所

Register、スタック、ヒープ、静的ストレージ、定数ストレージ (定数プール String a = “abc” a スタック内、“abc” 定数プール内) )、非RAMストレージ

2.基本データ型

クラスのメンバーとして、デフォルト値

boolean 1ビット デフォルトfalseに自動的に初期化されます

バイト 8ビット 1バイト u0000

char 16ビット 1文字 0

short 16ビット 0

int 32ビット 0

float 32 ビット 0.0f

long 64ビット 0L

double 64ビット 0.0d

3.高精度数値クラス

BigInteger 10 進数 高精度、遅い速度

4.javaガベージ処理

Java には、new で作成されたすべてのオブジェクトを検索し、参照されなくなったオブジェクトを識別する特別な「ガベージコレクター」があります。その後、アイドル状態のオブジェクトが占有しているメモリを自動的に解放し、新しいオブジェクトが使用できるようにします。

5.static実行順序

サブクラスstaticのstaticメンバー変数とstaticstatement

メンバー変数と静的ステートメント

親クラスの静的メンバー変数静的ステートメントブロック

親クラスのコンストラクターメソッド

静的

メンバー変数および非-static ステートメント ブロック

サブクラスのコンストラクター

(

static

は 1 回のみ実行されます。初回実行時 )

6 .

コレクション クラス

Vectorクエリ効率が高く、追加と削除の効率が低く、スレッド安全性があり、速度が遅く、元の増加の 2 倍になる、自動的に増加する配列。

ArrayListは、高いクエリ効率、低い追加と削除効率、スレッドアンセーフ、高速な速度で配列を自動的に拡張します。拡張は

0.5

倍です。 LinkedList 双方向の循環リンク リスト、クエリ効率は低い、追加と削除効率は高い、スレッドは安全ではありません。

HashMap は、配列とリンクリストの組み合わせであるリンクリストハッシュであり、

null

値を許可し、スレッドセーフで非常に効率的です。 TreeMapは、

Key

を使用してソートするバイナリソートツリーとして実装されています。 LinkedHashMapは、

HashMap

のサブクラスであり、出力順序を入力と同じにする必要がある場合は、を使用します。リンクされたハッシュマップ

Hashtable はスレッドセーフで非効率的であり、null 値を許可しません。

Set は反復不可能です:

TreeSet は、順序付けされスレッドセーフな TreeMap に基づいて実装されます。

HashSetは、HashMapHashMapkeyに基づいて実装されます。

LinkedHashSetは、LinkedHashMapに基づいて実装され、順序付けされます。

7.Mapトラバーサル

は、keySetの代わりにentrySettraverseMapクラスコレクションKVを使用しますを横断する方法。 explanation:キーズセット
は実際には鎖22倍になります。1回はそれをiteratorオブジェクトに変換することです。 価値。そして entrySet は 1 回だけトラバースし、
key value entry に入れるだけで、より効率的です。 JDK8 の場合は、Map.foreach メソッドを使用します。 良い例: values()は、
listコレクションオブジェクトであるV 値セットを返します。 、それ
Set コレクション オブジェクトです; entrySet()K-V 値の組み合わせセットを返します。

1entrySetは、キーと値のペアを格納するSetインターフェイスを実装します。 1つのKは1つのVに対応します。
2mapを走査するために使用されるメソッド。
Set>entryseSet=map.entrySet();
for (Map.Entryentry:entryseSet) {
System.out.println(entry.getKey() +","+entry.getValue());
}
getKey()を通じてKを取得し、getValueVを取得します。

3、そしてもう1つはkeySetです。
Set set = map.keySet();
for (String s:set) {
}

2. IOシステム

ブリッジストリーム:

InputStreamReader

バイトストリームを文字ストリームに変換します。 (文字ストリームに変換して読み込む)

OutputStreamWriter

文字ストリームをバイトストリームに変換する (バイトストリームに変換して書き込む)

アクセスパイプライン(スレッド対話)StringReaderバッファリングされたストリーム

1.Java IO は、コードの汎用性を実現するために処理ストリームを使用してノード ストリームをラップするデコレーション モードを採用しています。

2.処理フローとノードフローの区別方法 ノードフローは新規作成時にパラメータとしてデータソース(ファイル、ネットワーク)が必要ですが、処理フローはパラメータとしてノードフローが必要です。

3. 処理フローの役割は、コードの汎用性を高め、コードを書きやすくし、パフォーマンスを向上させることです。

4.ノードストリームはすべて抽象基本クラスに対応する実装クラスであり、すべて抽象基本クラスの基本的な読み書きメソッドを実装します。このうち、read()メソッドが-1を返した場合は、データソースの最後まで読み込んだことを意味します。

1. バイト単位の入力ストリームのフレーム図

​​

以下は、バイト単位の入力ストリームのフレーム図です。

ここから、わかります。
(01) InputStream は、バイト単位の入力ストリームのスーパークラスです。 InputStream は、入力ストリームからバイトデータを読み取るための read() インターフェースを提供します。
(02) ByteArrayInputStream はバイト配列入力ストリームです。ストリームから読み取られたバイトを含む内部バッファーが含まれています。平たく言えば、その内部バッファーはバイト配列であり、 ByteArrayInputStream は本質的にバイト配列を通じて実装されます。
(03) PipedInputStreamは、複数のスレッド間のパイプライン通信を実現するためにPipedOutputStreamと一緒に使用されます。
(04) FilterInputStream は入力ストリームをフィルタリングします。 DataInputStreamBufferedInputStreamのスーパークラスです。
(05) DataInputStream はデータ入力ストリームです。これは他の入力ストリームを修飾するために使用され、「アプリケーションがマシンに依存しない方法で基礎となる入力ストリームから基本的な Java データ型を読み取ることができる」ようになります。
(06) BufferedInputStream はバッファリングされた入力ストリームです。これは、バッファリング機能を別の入力ストリームに追加することを目的としています。
(07) ファイルは、「ファイル」と「ディレクトリのパス名」を抽象的に表現したものです。 File に関しては、2 つの点に注意してください:
a)、File はファイルを表すだけでなく、ディレクトリも表すことができます。
b)、Fileioで定義されていますが、そのスーパークラスはInputStreamではなくObjectです。
(08) FileDescriptor は「ファイル記述子」です。開いているファイル、開いているソケットなどを表すために使用できます。
(09) FileInputStream はファイル入力ストリームです。通常、ファイルの読み取り操作に使用されます。
(10) ObjectInputStream はオブジェクト入力ストリームです。 ObjectOutputStream と合わせて、「基本データまたはオブジェクト」の永続的なストレージを提供するために使用されます。


2. バイト単位の出力ストリームのフレーム図

​​

以下は、バイト単位の出力ストリームのフレーム図です。

これからわか​​ります。バイト単位の出力ストリームの共通の親クラスは OutputStream です。
(01) OutputStream は、バイト単位の出力ストリームのスーパークラスです。 OutputStream は、出力ストリームからバイトデータを読み取るための write() インターフェースを提供します。
(02) ByteArrayOutputStream はバイト配列出力ストリームです。 ByteArrayOutputStream に書き込まれたデータは、バイト 配列に書き込まれます。データが継続的に書き込まれると、バッファーは自動的に増加します。データはtoByteArray()toString()を使用して取得できます。
(03) PipedOutputStreamは、複数のスレッド間のパイプライン通信を実現するためにPipedInputStreamと一緒に使用されます。
(04) FilterOutputStream はフィルター出力ストリームです。 DataOutputStreamBufferedOutputStreamPrintStreamのスーパークラスです。
(05) DataOutputStream はデータ出力ストリームです。これは他の出力ストリームを修飾するために使用され、「アプリケーションがマシンに依存しない方法で基礎となる Java データ型に書き込むことができる」ようになります。
(06) BufferedOutputStream はバッファリングされた出力ストリームです。これは、バッファリング機能を別の出力ストリームに追加することを目的としています。
(07) PrintStream は印刷出力ストリームです。これは、他の出力ストリームを装飾し、他の出力ストリームに機能を追加して、さまざまなデータ値表現を簡単に印刷できるようにするために使用されます。
(08) FileOutputStream はファイル出力ストリームです。通常、ファイルへの書き込みに使用されます。
(09) ObjectOutputStream はオブジェクト出力ストリームです。 ObjectInputStream と合わせて、「基本データまたはオブジェクト」の永続的なストレージを提供するために使用されます。

3、マルチスレッド

ライフサイクル

スレッドには次の5状態が含まれます。
1. 新しい状態(New): スレッドオブジェクトが作成されると、新しい状態に入ります。たとえば、スレッド thread = new Thread()
2. 準備完了状態(実行可能): 「実行可能状態」とも呼ばれます。スレッド オブジェクトが作成された後、他のスレッドはオブジェクトの start() メソッドを呼び出してスレッドを開始します。たとえば、thread.start()。準備完了状態のスレッドは、いつでも CPU によって実行されるようにスケジュールできます。
3. 実行ステータス(実行中): スレッドは、実行のためのCPU権限を取得します。スレッドは準備完了状態からのみ実行状態に入ることができることに注意してください。
4. ブロック状態(ブロック) : ブロック状態とは、スレッドが何らかの理由でCPUを使用する権利を放棄し、一時的に実行を停止することです。スレッドが準備完了状態になるまで、実行状態に移行する可能性があります。ブロック状況は 3 つあります:
(01) 待機ブロック -- スレッドの wait() メソッドを呼び出すことにより、スレッドに特定の作業の完了を待機させます。
(02) 同期ブロッキング -- スレッドは synchronized 同期ロックを取得しています ( ロックが他のスレッド によって占有されているため)、を入力してください同期ブロッキング状態。
(03) その他のブロック -- スレッドのsleep()またはjoin()を呼び出すか、I/Oリクエストが発行されると、スレッドはブロッキング状態に入ります。 sleep()ステータスがタイムアウトになると、join()はスレッドが終了するかタイムアウトするまで待機するか、I/Oが完了すると、スレッドは準備完了状態に戻ります。
5. 死亡状態(Dead) : スレッドは実行を終了したか、例外により run() メソッドを終了し、スレッドはライフサイクルを終了します

2.start()run()説明

//継承Thread

class MyThread extends Thread{

... .. .

}

};

MyThread mt=new MyThread();

スレッド t1=new Thread(mt);

mythread.start() は新しいスレッドを開始し、新しいスレッドで run() メソッドを実行します。
そして、mythread.run()は、現在のスレッドでrun()メソッドを直接実行し、run()を実行するための新しいスレッドを開始しません。

3.synchronized

synchronizedの基本的なルールを以下の3の項目にまとめ、例を示して説明します。
最初の: スレッドがオブジェクト」「」同期メソッドまたは」同期にアクセスするときコードブロック、その他スレッドは "このオブジェクト" "synchronized メソッド " または "synchronized コード ブロック " を呼び出しますさんの訪問はブロックされます。 2番目の
: スレッドがオブジェクト」「」同期メソッドまたは」同期にアクセスするときコードブロック、他のスレッドこのオブジェクトの非同期コードブロックには引き続きアクセスできます。 第3条: スレッドが
オブジェクト」「」同期メソッドまたは」同期にアクセスするとき「コードブロック他のときスレッドは " このオブジェクト " を他の "synchronized メソッド " または "synchronized コード ブロック " に使用します訪問はブロックされます。

4.wait()、notify()、notifyAll()

notify()-- このオブジェクトモニターで待機している単一のスレッドを起動します。
NoticeAll()-- このオブジェクト モニターで待機しているすべてのスレッドを起動します。
wait()-- 他のスレッドがこれを呼び出すまで、現在のスレッドを "wait(blocking)状態にしておくオブジェクトの notify() メソッド または notifyAll() メソッド "、現在のスレッドが起動されます ( "準備完了状態"に入ります) wait(長いタイムアウト) -- 現在のスレッドを "wait (
ブロック)" " 状態にするスレッドはこれを呼び出しますオブジェクトの notify() メソッドまたは notifyAll() メソッド、または指定された時間を超える "、現在のスレッドが起動されます ( から "準備完了状態) 」) wait(long timeout, int nanos) -- 他のスレッドがこれを呼び出すまで、現在のスレッドを"wait(blocking
)", "に入れておくオブジェクトの notify() メソッドまたは notifyAll() メソッド、または他のスレッドが現在のスレッドに割り込むか、一定のリアルタイム " が経過し、現在のスレッドが起動します (準備完了状態」と入力してください)5.yield()はじめにyield()関数はyieldすることです。これにより、現在のスレッドが 実行状態

から

準備完了状態

に移行できるため、同じ優先順位を持つ他の待機中のスレッドが実行権限を取得できるようになります。現在のスレッドが yield() を呼び出した後、同じ優先度を持つ他のスレッドが実行権を取得できるという保証はありません。また、現在のスレッドが " 実行状態に入っている可能性もあります。 走り続けます!」

6.sleep()はじめに

sleep()Thread.javaで定義されています。
sleep() の機能は、現在のスレッドをスリープ状態にすることです。つまり、現在のスレッドは "実行状態" から "スリープ(ブロック) . sleep() はスリープ時間を指定し、スレッドのスリープ時間はスリープ時間に等しい / より大きくなり、スレッドが再び目覚めると、"" から変更されます。ブロック状態" "準備完了状態"、したがって、cpuのスケジュールされた実行を待っています。

wait()の関数は、現在のスレッドを"実行ステータス""wait(ブロックされました)から入ることを知っています。 ステータスでも同期ロックが解除されます。 sleep()の機能は、現在のスレッドを実行ステータス」からスリープ(ブロック)」に変更することです。 ステータスただし、wait()はオブジェクトの同期ロックを解放しますが、
sleep()はロックを解放しません。 次の例は、sleep() がロックを解放しないことを示しています。

wait()の関数は、現在のスレッドを"実行ステータス""待機中(ブロック)状態からに入らせることであることがわかっています。 同時に同期ロックも解除されます。 yield()の関数は譲歩であり、現在のスレッドを離脱させます実行ステータス。それらの違いは次のとおりです:
(01) wait() を使用すると、スレッドは 実行状態」から 待機中(ブロック)」状態に入ることができます。 "、そしてyield()は、スレッドを"実行状態"から"準備完了状態"に移行させることです(02) wait() を使用すると、スレッドは保持しているオブジェクトの同期ロックを解放しますが、
yield() メソッドはロックを解放しません。 7.

join()

はじめにjoin()

Thread.javaで定義されています。 join() の関数:
" メインスレッド " は、実行を続ける前に " 子スレッド " が終了するまで待機させます。この文は少しわかりにくいかもしれませんが、例を通して理解する必要があります: //

Main thread

public class Father extends Thread { public void run() {

Son s = new Son() ;

s.start();

s.join();

() {

...

}

}子スレッドが生きているとき (isAlive() )、メインスレッドは待機し続けます (wait(0))8.

interrupt()

そして、スレッドを終了する方法

interrupt()

は、このスレッドに割り込むことです。このスレッドはそれ自体に割り込むことができます。他のスレッドがこのスレッドの

interrupt()

メソッドを呼び出すと、

checkAccess() を通じて権限をチェックします。これにより、

SecurityException

例外がスローされる可能性があります。

このスレッドがブロック状態にある場合: スレッドの wait()、wait(long)、または wait(long, int) を呼び出すと、待機状態になります(blocking) status を呼び出したり、スレッドの join()、join(long)、join(long, int)、sleep(long)、sleep(long, int) を呼び出したりすると、スレッドはブロック状態になります。スレッドがブロック状態にあるときに interrupt() メソッドを呼び出すと、その Interrupted state がクリアされ、InterruptedException 例外が受信されます。たとえば、スレッドは wait() を通じてブロック状態に入り、その後 interrupt() を通じてスレッドを中断します。 "true"ですが、スレッドがブロックされているため、"割り込みフラグ"はすぐに"false"にクリアされ、同時にInterruptedExceptionが発生します例外が生成されます。 Selectorセレクターでスレッドがブロックされている場合、

interrupt()

を介してスレッドを中断すると、スレッドの割り込みフラグがtru​​eに設定され、スレッドから削除されます。操作中に選択がすぐに返されます。 上記の状況に該当しない場合、interrupt()を通じてスレッドが中断されると、その割り込みフラグは

"true"

に設定されます。 終了したスレッド

を中断しても、アクションは発生しません。 8.1 スレッドを「ブロック状態」で終了する

通常、スレッドは

ブロック状態

で終了します。 sleep()、wait()、join()などのメソッドが呼び出され、スレッドがブロッキング状態になったとき、この時点でスレッドのinterrupt()が呼び出されると、スレッドの割り込みが発生します。マークは true に設定されます。ブロック状態にあるため、割り込みマークがクリアされ、
InterruptedException例外が発生します。 InterruptedExceptionを適切に配置してスレッドを終了します

8.2 「実行状態」のスレッドを終了する

通常、実行状態のスレッドをマークによって終了します。これらには、ブレークマーク追加マークが含まれます。
(01) 割り込みフラグを介してスレッドを終了します。
形式は次のとおりです:

@Overridepublic void run() {

説明:

isInterrupted()

は、スレッドの割り込みマークがtru​​eであるかどうかを判断します。スレッドが実行中で、それを終了する必要がある場合は、スレッドの割り込みマークを

tru​​e

として使用して、スレッドの interrupt() メソッドを呼び出すことができます。つまり、 isInterrupted() が返されます。 本当。この時点で、whileループは終了します。 注: interrupt()は、実行状態
のスレッドを終了しません!スレッドの割り込みフラグを tru​​e に設定します。 (02) 作成者: 追加タグ

形式は次のとおりです: private volatile boolean flag= true;protected void stopTask() { flag = false;}
@Overridepublic void run() {

while (flag) ) {

任 //

タスクを実行

...}}

説明: スレッドには

Flag

マークがあり、そのデフォルト値は

True

であり、Stoptask が提供されています。 ()

flag

タグを設定します。スレッドを終了する必要がある場合、スレッドの stopTask() メソッドを呼び出すと、スレッドが while ループを終了できます。 注: flagvolatileタイプとして定義することは、flagの可視性を確保することです。つまり、他のスレッドが stopTask()
を通じて flag を変更した後、このスレッドは flag の変更された値を確認できます。

最後に、interrupted()isInterrupted()について話しましょう。
interrupted() isInterrupted() はどちらも、オブジェクトの 中断フラグ を検出するために使用できます。
の違いは、interrupted()は割り込みマークを返すだけでなく、isInterrupted( ) 割り込みフラグを返すだけです 9. スレッドの優先順位とデーモンスレッド

すべてのスレッドには優先順位があります。 優先度の高いスレッド

優先度の低いスレッドよりも先に実行されます。各スレッドはデーモンまたは非デーモンとしてマークできます。実行中のメインスレッド内で新しい子スレッドが作成されると、子スレッドの優先順位は、" の場合に限り、それを作成したメインスレッドの優先順位""に等しく設定されます。それを作成したメインスレッドはデーモンスレッドwhen子スレッドはデーモンスレッドになります" Java 仮想マシンが起動すると、通常は 1 つの非デーモン スレッドが存在します (このスレッドは main()

メソッドを通じて起動されます)。

JVM

は、次のいずれかの条件が発生するまで実行を続けます。JVMは終了します: (01) exit()メソッドを呼び出し、exit()

通常に実行する権限があります。

(02) すべての非デーモンスレッド

は死んでいます

(、つまり、JVMには"デーモンスレッドしかありません) ”)すべてのスレッドは、デーモンスレッド

または

ユーザースレッドとしてマークされます。デーモンスレッドのみが実行されている場合、JVMは自動的に終了します。

ストリーム分類

カテゴリを使用します

バイト入力ストリーム

バイト出力ストリーム

文字入力ストリーム

文字出力ストリーム

抽象基本クラス

入力ストリーム

OutputStream

Reader

Writer

いいえストリームで

ファイルにアクセス

FileInputStream

FileOutStream

FileReader

FileWriter

アクセス値

ByteArrayInputストリーム

ByteArrayOutStream

CharArrayReader

CharArrayWriter

PipedInputStream

PipedOutStream

PipedReader

PipedWriter

アクセスstring

StringWriter

処理ストリーム

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

Convert Stream

InputStream Reader

OutputStreamWriter

オブジェクトストリーム

ObjectInputStream

ObjectOutputStream

抽象基本クラス (フィルタリング)

FilterInputStream

FilterOutputStream

FilterReader

FilterWriter

プリントストリーム

プリントストリーム

PrintWriter

PushbackInputStream

PushbackInputStream

プッシュバックリーダー

特別ストリーム

DataInputStream

DataOutputStream

以上がJava の面接での基本的な質問を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。