JAVAの基本+エントリ+習得する必要がある知識

JAVAの基本

オブジェクト指向の3つの基本的な特性

パッケージ

  • 客観的なものを抽象クラスにカプセル化し、クラスは信頼できるクラスまたはオブジェクトだけが独自のデータとメソッドを操作し、信頼できないものから情報を隠すことができます

相続

  • 特定のタイプのオブジェクトが別のタイプのオブジェクトのプロパティとメソッドを取得できるようにします

ポリモーフィズム

  • 同じメソッドのクラスインスタンスを参照すると、状況によってパフォーマンスが異なります

5つの原則

単一責任の原則

  • すべてを網羅するのではなく、単一の機能を持つクラスを参照します

オープンとクローズの原則

  • モジュールは拡張のために開いて、変更のために閉じる必要があります

交換の原則

  • サブクラスは親クラスを置き換えることができ、親クラスのどこにでも表示できる必要があります

依存関係の原則

  • 具体的には抽象化に依存し、上位層は下位層に依存します

インターフェース分離原理

  • モジュールは、具象クラスによって強く結合されているのではなく、抽象インターフェースによって分離する必要があります

==等しいの違い?

1. equalsメソッドは、2つのオブジェクトの内容を比較します
。2. == 2つのオブジェクトが同じオブジェクトであるかどうかを比較するか、オブジェクトのメモリアドレスが同じかどうかを比較します(基本タイプの場合、==は2つを比較します2つの値は等しいですか?参照タイプの場合、==は参照アドレスが同じかどうかを比較します)


静的変数とインスタンス変数の違いは?

1.静的変数はクラスに属し、静的変数はクラス名で直接呼び出すことができます
2.インスタンス変数はオブジェクトに属し、インスタンス変数を呼び出す前にクラスのオブジェクトを生成する必要があります


オーバーロード(メソッドオーバーロード)とオーバーライド(メソッドオーバーライド)の違いは何ですか?

メソッドのオーバーロードは、同じクラスの2つ以上のメソッドが同じメソッド名を持っているがパラメーターが異なる場合に発生します。
メソッドカバレッジ親クラスメソッドを再定義する場合、メソッドカバレッジは同じメソッド名とパラメーターリストを持っている必要がありますそして、戻り値の型


抽象クラスとインターフェースの違いは何ですか?

1.インターフェースのすべてのメソッドは暗黙的に抽象的であり、抽象クラスは抽象メソッドと非抽象メソッドの両方を含むことができます

2.クラスは多くのインターフェースを実装できますが、継承できるのは抽象クラスのみです

3.クラスがインターフェースを実装したい場合、このインターフェースのすべてのメソッドを実装する必要があります。ただし、クラスが抽象クラスのすべてのメソッドを実装しているとは限りません。もちろん、この場合、クラスも抽象クラスでなければなりません。

4. Javaインターフェースで宣言された変数はデフォルトでfinalであり、抽象クラスは非final変数を含むことができます

5. Javaインターフェースのメンバー関数はデフォルトでパブリックであり、プライベート保護またはパブリックを抽象クラスに含めることができます

6.インターフェイスは完全に抽象的であり、インスタンス化することはできません。抽象クラスはインスタンス化できませんが、mainメソッドがある場合は呼び出すことができます。


stringBuilderとstringBufferの違いは何ですか?

文字列は、finalによって変更される文字列定数です。stringBufferはスレッドセーフな文字列変数で、stringBuilderはスレッドセーフでない変数です。

文字列は不変オブジェクトです。文字列型に対する各操作は、新しい文字列オブジェクトを生成することと同じです。そのため、文字列に対して大量のステッチを実行しないでください。そうしないと、一時オブジェクトが大量に生成され、GCが機能し始め、システムのパフォーマンスに影響を及ぼします。
StringBufferとStringBuilderは、新しいオブジェクトを生成するのではなく、オブジェクト自体を操作します。
注:JVMは、文字列のスティッチングに対して次のような特定の最適化を行います:String s = "hello" + "world";これ
は、JVMによってString s = "helloworld"に直接最適化され、現時点ではスティッチングはありません。


文字列の一般的なメソッド:
charAt(int index)
equals()
substing()
trim()
length()
indexOf()
endsWith()
startWith()
equalsIngorCase()
uppstring()
toLower()
toUpCase()


実行異常と一般異常の違いは何ですか?

異常とは、プログラムの実行中に発生する可能性のある異常な状態を示し、実行時異常とは、仮想マシンの動作中に発生する可能性のある異常を示し、一般的な操作エラーです。
Javaコンパイラーは、メソッドが発生する可能性のある非ランタイム例外をスローすることを要求しますが、キャッチされないランタイム例外を宣言する必要はありません。


深いコピーと浅いコピーの違いは?

浅いコピー:コピーされたオブジェクトのすべての変数は元のオブジェクトと同じ値を含み、他のオブジェクトへのすべての参照は依然として元のオブジェクトを指します。言い換えると、浅いコピーは、検討中のオブジェクトのみをコピーし、彼が参照するオブジェクトはコピーしません。
ディープコピー:コピーされたオブジェクトのすべてのオブジェクトは元のオブジェクトと同じ値を持ち、他のオブジェクトを参照する変数は、元の参照されたオブジェクトではなく、コピーされた新しいオブジェクトを指します。つまり、ディープコピーは、コピーされるオブジェクトによって参照されるすべてのオブジェクトをコピーします。


equals()とhashCode()の関係は?

hashCode()はオブジェクトクラスのメソッドであり、ハッシュ値を返します。equals()メソッドに従って2つのオブジェクトが等しい場合、これら2つのオブジェクトのいずれかのhashCode()メソッドを呼び出すと、確実に同じハッシュ値が生成されます。 。equals()メソッドに従って2つのオブジェクトが等しくない場合、生成されるハッシュ値は必ずしも等しくありません。


コレクションとコレクションの違いは?

コレクションは、コレクションクラスの上位のインターフェイスです。継承されるインターフェイスは、主にSetおよびList
コレクションです。これは、コレクションクラスのヘルパークラスです。彼は、さまざまなコレクションの検索、並べ替え、およびスレッドセーフ操作を実装する一連の静的メソッドを提供しています。


リストとセットの違いは何ですか?

1.リストとセットの両方がコレクションインターフェースから継承されます
2.リスト要素が順番に配置され、要素を繰り返すことができます。セット機能。要素は順不同で配置され(格納場所は要素のハッシュコード値によって決定されるため、順序付けされていません)、要素は繰り返すことができません;
3.リストインターフェースの実装クラス:LinkedList ArrayList Vector
セットコレクションの実装クラス:HashSet、LinkedHashSet


セットのコレクションが繰り返されないようにするにはどうすればよいですか?

1. 2つのオブジェクトのhashCodeが等しいかどうかを判断します。等しく
ない場合、2つのオブジェクトは等しくなく、完全であると見なされます。
等しい場合は、2に進みます。2
. 2つのオブジェクトの等しい()が等しいかどうかを判断します
。オブジェクトが等しくない

hashCodeは主にストレージ効率を向上させるためのものです。


プロセスとスレッドの違いは?

プロセスは独立した実行環境であり、プログラムまたはアプリケーションと見なすことができます。スレッドはプロセスで実行されるタスクです。Java環境は、さまざまなクラスとプログラムを含む単一のプロセスです。スレッドは、プロセス内で作成および常駐するために必要なリソースが少なく、プロセス内のリソースを共有できます。

スレッドの状態はどうですか?

スレッドの実行中、スレッドは次の状態になる可能性があります。
準備完了:スレッドは実行の準備ができており、必ずしもすぐに実行を開始できるとは限りません。
Running:プロセスはスレッドコードを実行しています。
待機中:スレッドはブロックされ、外部処理の終了を待機しています。
スリープ中:スレッドは強制的にスリープ状態になります
i / oブロック:i / o操作が完了
するのを待機しています同期ブロック:ロックの取得を待機しています
デス:スレッドの実行が終了しました。

スレッド同期の方法は何ですか?

1.同期キーワード変更メソッド
2.同期キーワード変更ステートメントブロック
3.再入可能ロッククラスを使用したスレッド同期
4. ThreadLocal管理変数を使用したスレッド同期
5.ブロッキングキューの
使用6.アトミック変数の使用

複数のスレッドの正常な実行を確実にする方法は?

1.共有オブジェクトロックにより、各メソッドに入ることができるスレッドは1つだけです。waitメソッドとnitifyallメソッドを使用すると、スレッドを開始または変更できます
。2 メインスレッドのjoin()を使用して

Javaの待機メソッドとスリープメソッドの違いは何ですか?

1. 2つのメソッドは、スレッドとオブジェクトの異なるクラスに由来します
。2。スリープはロックを解放せず、待機メソッドにはロックがあるため、他のスレッドは同期制御ブロックまたはメソッドを使用できます
。3。待機通知と通知すべては同期でのみ制御できます。メソッドまたは同期充電ブロックが使用され、スリープメソッドはどこでも使用できます。
4. sleepメソッドは例外をキャッチする必要がありますが、wait、notify、notifyAllは例外をキャッチする必要はありません。

yield()メソッド:

yield()を呼び出すと、現在のスレッドがCPU権限を放棄し、CPUに他のスレッドを実行させます。sleep()メソッドと同様に、ロックは解放されません。ただし、yield()はCPUを渡す時間を制御できません。また、yield()メソッドは同じ優先度のスレッドにのみCPU実行時間を取得する機会を与えることができます。さらに、yield()メソッドはスレッドをブロッキング状態に移行させません。スレッドを準備完了状態に戻すには、スリープ()とは異なり、CPU実行時間の再取得を待つ必要があります。


ThreadLocalの用途は何ですか?

彼はスレッドローカル変数を作成するクラスです。簡単に言うと、ThreadLocalは時間を空間で交換する方法です。各スレッドでは、open addressメソッドによって実装されるThreadLocal.ThreadLocalMapが維持され、データが分離され、データは共有されません。当然、スレッドの安全性に問題はありません。


スレッドの同期と非同期の違いは何ですか?

同期:Aスレッドは特定のリソースを要求しようとしていますが、このリソースはBによって使用されています。同期メカニズムが存在するため、Aスレッドはリソースを要求できず、待機することしかできません。

非同期:Aスレッドは特定のリソースを要求しますが、このリソースはBによって使用されています。同期メカニズムがないため、Aスレッドは待機せずにリソースを要求できます。

スレッドローカル変数ThreadLocalについて簡単に説明してください。

スレッドローカル変数は、スレッド自体に属し、複数のスレッド間で共有されないスレッドメモリに限定される変数であり、スレッドの安全性を実現する方法です。


Javaマルチスレッドの悲観的ロックと楽観的ロックについて簡単に説明してください。

悲観的ロック:マルチスレッドの競合が発生するかどうかに関係なく、そのような可能性がある限り、ロックにアクセスするたびに、ロックはロック間の競合につながります。

オプティミスティックロック:ロックが取得された後、スレッドがロックを再適用して恐れのないロック解除とロックのオーバーヘッドが発生するのを防ぐためにロックが保持されています。


finalize()メソッドはいつ呼び出され、その役割は何ですか?

オブジェクトによって占有されているメモリを解放する前に、ガベージコレクターはオブジェクトのfinalize()メソッドを呼び出します。通常、このメソッドでオブジェクトが保持しているリソースを解放することをお勧めします。


クラス読み込みメカニズムと読み込みプロセスについて簡単に説明してください。

クラスは、仮想マシンのメモリに読み込まれることから始まり、メモリをアンロードします。彼のライフサイクル全体には、読み込み、検証、準備、解析、初期化、使用、およびアンロードの7つの段階があります。検証、準備、分析の3つの部分をまとめてリンクと呼びます。

ロード:ロード段階は、次の主要機能を持つクラスローダーによって完了します。
(1)このクラスを定義するバイナリバイトストリームを取得します。
(2)このバイトストリームで表される静的ストレージ構造をメソッド領域のランタイムデータ構造に変換します
(3)このクラスを表すJava.lang.ClassオブジェクトをJavaヒープに生成します

検証:検証は接続フェーズの最初のステップです。このフェーズの目的は、Classファイルのバイトストリームに含まれる情報が現在の仮想マシンの要件を満たし、仮想マシン自体のセキュリティを危険にさらさないことを確認することです。
準備:クラスの静的変数にメモリを割り当て、それらをデフォルト値に初期化します。これらのメモリはメソッド領域に割り当てられます。
解決策:解決フェーズは、仮想マシンが定数プール内のシンボル参照を直接参照に置き換えるプロセスです
:初期化ステージは、クラスコンストラクター()メソッドを実行するプロセスです。

Javaの8つの基本データ型?


								占用字节
byte						1
short						2
int							4
long						8
float						4
double						8
char						2
boolean						1/8
=======================
1byte 		= 	8it
1024byte	=	1kb
1024kb	   	= 	1M
1024m 		= 	1G

MapとConcurrentHashMapの違い:

ConcurrentHashMapはバケット配列全体をセグメント、つまりセグメントに分割し、ロックロックを使用して各セグメントを保護します。同期されたキーワードロックの粒度はHashTableよりも細かく、同時パフォーマンスは向上しますが、HashMapはそうではありません。ロックメカニズムはスレッドセーフではありません。HashMapキーの値はnullにすることができますが、ConcurrentHashMapは許可されていません。


httpプロトコルの簡単な説明?

HTTP:ハイパーテキスト転送プロトコルは、要求と応答モードに基づく、多くの場合TCP接続に基づく、ステートレスなアプリケーション層プロトコルです。
httpリクエストヘッダーは、リクエストライン、メッセージヘッダー、リクエストボディの3つの部分で構成されます。レスポンスは、ステータスライン(httpバージョン、ステータスコード、ステータスコードの理由フレーズを含む)、レスポンスヘッダーフィールド、レスポンス内部の3つの部分に分かれています。エンティティ。


リダイレクトとフォワードの違いは?

1.リダイレクトはクライアントの動作であり、転送はサーバーの動作です
。2. 2つの要求と2つの応答のリダイレクト、1つの要求の転送と1つの応答の転送
3.リダイレクトは任意のWebサイトにジャンプでき、転送はサーバー内でのみ転送できます
4。リダイレクションによりリクエストオブジェクト情報が失われ、転送は行われません


クッキーとセッションの機能と違いは何ですか?

1. Cookieデータはクライアントに保存され、セッションはサーバーに保存されます
。2。Cookieは安全ではありません。他のユーザーはローカルに保存されたCookieとスプーフィングCookieを分析できます。したがって、重要なデータはセッションを使用してサーバーに保存する必要があります。
3.セッションは一定期間サーバーに保存されますが、メモリリソースを占有します。アクセスされるユーザーが多すぎると、サーバーの負荷が増加します。サーバーの負荷を考慮すると、重要でないデータはCookieに保存する必要があります。
4. Cookieによって保存されるデータは4Kを超えることはできません。


コレクション

単一列コレクション

リスト

配列リスト

基になる配列、高速なクエリ、遅い追加と削除、安全ではない、高効率の実現

デフォルトの容量は10で、拡張後に50%増加します

LinkedList

基になるリンクリストの実現、クエリの遅延、追加と削除の高速化、安全ではない、高効率

ベクター

基礎となるデータの実装、追加、削除、変更は遅いですが、安全です

デフォルトの容量は10で、デフォルトの負荷係数は1です。これは、拡張後の元の容量の2倍です。

セットする

ハッシュセット

基になるHashMap、基になるリンクリストのサブクラスLinkedHashSet実装

デフォルトの容量は16、負荷係数は0.75、拡張は2倍です

TreeSet

並べ替えることができ、基になるバイナリツリーアルゴリズムが実装されています

2列のコレクション

地図

HashMap

基になるハッシュアルゴリズムは、キーについて、nullキーと値、スレッドの不安定性、高効率、キーを繰り返し保存できない、値を

デフォルトの容量は16で、負荷係数は0.75で、容量は拡張後に2倍になります

TreeMap

最下層は二分木で、キーでソートできます

LinkedHashMap

最下層はハッシュアルゴリズムであり、HashSetと同様に、キーは一意であり、値を変更できます。

辞書

ハッシュ表

nullキーと値、スレッドセーフ、および低効率を許可しない

デフォルトの容量は11、拡張は2倍+ 1


スレッドプール

1、corePoolSize

コアスレッドの数

スレッドプールが作成された後、デフォルトでは、スレッドプールにはスレッドはありませんが、スレッドが作成されてタスクをフェッチする前に、タスクが到着するのを待ちます。
デフォルトでは、スレッドプールが作成された後、スレッドプール内のスレッド数は0です。タスクが来ると、タスクを実行するためのスレッドが作成されます。スレッドプール内のスレッド数がcorePoolSizeに達すると、その数に達します。タスクはキューにキャッシュされ、アイドル状態のスレッドがある場合、タスクは実行のために割り当てられます。

2、maxiumPoolSize

スレッドプールで許可されるスレッドの最大数

スレッドプールで許可されるスレッドの最大数。キューがいっぱいであるが、作成されるスレッドの数がスレッドの最大数より少ない場合、スレッドプールは新しいスレッドを作成してタスクを実行します。

ただし、無制限のキューを使用している場合、このパラメーターは効果がありません。

3、keepAliveTime

タスクが実行されていないときにスレッドを終了できる時間を示します

タスクが実行されていないときにスレッドが終了する時間を示します。
デフォルトでは、keepAliveTimeは、スレッドプール内のスレッド数がcorePoolSizeを超えていないことがわかっているため、スレッドプール内のスレッド数がcorePoolSizeより大きい場合にのみ機能します。

つまり、このパラメーターは、corePoolSizeより大きく、maximumPoolSizeより小さいスレッドで機能するようにします。

4、TimeUnitで

時間単位:ナノ秒、微妙、ミリ秒、秒、分、時、日、計7種類

5、workQueue

タスクの実行を待機しているブロッキングキューを保存します

synchronizedQueue
タグ:優先度1

このキューがタスクを受け取ると、タスクを保持するのではなく、スレッドに直接送信して処理します。すべてのスレッドが機能している場合は、スレッドが作成されます。したがって、スレッドの数がmaxiunPoolSizeに達してスレッドを作成できないというエラーが発生しないようにするために、このキューを使用する場合、一般的に言って、maxiunPoolSizeはInteger.MAX_VALUE、つまり無限大として指定されます。

LinkedBlockingQueue
タグ:優先度2

このキューがタスクを受け取ったときに、現在のスレッド数がcorePoolSizeより小さい場合は、処理する新しいスレッドを作成し、現在のスレッド数がコアスレッドの数と等しい場合は、キューに入ると待機します。これにより、maxiumPoolSize設定が無効になります。スレッドの総数は常にcorePoolSizeを超えません。

ArrayBlockingQueue
タグ:優先度3

キューの長さを設定できます。タスクを受信したときに、corePoolSizeに達していない場合は、新しいスレッドが作成されます。到達した場合は、キューに入り、待機します。キューがいっぱいの場合は、新しいスレッドが作成されます。キューがいっぱいの場合、エラーが報告されます。

DelayQueue
タグ:優先度4

キュー内の要素はDelayedインターフェースを実装する必要があります。つまり、渡すタスクはDelayedインターフェースを実装する必要があります。キューがタスクを受け取った後、最初にキューに入り、指定された時間に達するまでタスクは実行されません。

6、ThreadFactory

スレッドファクトリ、主にスレッドの作成に使用

7、RejectedExecutionHandler

キューとスレッドプールがいっぱいになり、スレッドプールが飽和していることを示す場合、送信された新しいタスクを処理するための戦略を採用する必要があります。このポリシーのデフォルトは(1)AbortPolicyです。つまり、新しいタスクを処理できない場合、新しいタスクをスローできません。合計4つのタイプがあり、他の3つのタイプは次のとおりです。(2)DiscardPolicyは、例外をスローせずにタスクを破棄することを意味します。(3)DiscardOldestPolicyは、キュー内の最初のタスクを破棄してから、タスクの実行を再試行することを意味します。(4)CallerRunsPolicyは、タスクが呼び出しスレッドによって処理されることを示します。

元の4件の記事を公開 賞賛4件 訪問数103件

おすすめ

転載: blog.csdn.net/qq_40585384/article/details/105376604