Java を体系的かつ包括的に学びたいと思っています。結局、学校ではあまり役に立つことを学べなかったので、面接問題から始めようと思います。どうせその後は仕事を探さなければならないですし。
Java を体系的かつ包括的に学びたいと思っています。結局、学校ではあまり役に立つことを学べなかったので、面接問題から始めようと思います。どうせその後は仕事を探さなければならないですし。LeetCode は私にとってはまだ難しすぎますが、将来的には LeetCode を学ぶためにブログを書かなければなりません。今は簡単な面接問題から始めます(実際には簡単ではありませんが)。ネットで見つけた Java の最も一般的な 200 以上の面接問題を参考にして、漏れを確認しながら、一つずつ克服していきます!
Java 基礎#
1.JDK と JRE の違いは何ですか?#
これは簡単です。JDK は Java Development Kit(Java 開発キット)で、開発者向けであり、JRE と Java ツール(javac など)および Java 基本クラスライブラリを含んでいます。JRE は Java Runtime Environment(Java 実行環境)で、Java を使用する人向けです。JVM(Java 仮想マシン)とコアクラスライブラリを含んでいます。
2.== と equals の違いは何ですか?#
まず、== は比較演算子で、equals は Object クラスが提供するメソッドです。equals はオーバーライド可能で、しばしばオーバーライドされます。オーバーライドされていない場合、== と equals は同等の機能を持ちます。equals がオーバーライドされると、具体的に分析する必要があります。基本的には、== 演算子は基本型を比較する際にはその値を比較し、参照型を比較する際には 2 つの変数のメモリアドレスを比較します。equals は一般的にメモリアドレスが指す値を比較します。基本型の比較には使用できません。最も一般的なのは、String の equals が文字列が同じかどうかを比較することです。
Integer と int の違いを思い出すために、以下のコードを見てください。
public static void main(String[] args) {
//-128 ~ +127の間
Integer a = 5;
int b = 5;
Integer c = new Integer(5);
Integer d = 5;
System.out.println(a.equals(b));
System.out.println(a == b);
System.out.println(a.equals(c));
System.out.println(a == c);
System.out.println(a == d);
//-128 ~ +127の外
a = 128;
b = 128;
c = new Integer(128);
d = 128;
System.out.println(a.equals(b));
System.out.println(a == b);
System.out.println(a.equals(c));
System.out.println(a == c);
System.out.println(a == d);
}
答え:
//-128 ~ +127の間
True True True False True
//-128 ~ +127の外
True True True False False
3.2 つのオブジェクトの hashCode () が同じ場合、equals () も必ず true ですか?#
まず、必ずしもそうではありません。なぜなら、両方のメソッドはオーバーライド可能であり、完全に自分次第だからです。
hashCode () はそのオブジェクトのハッシュコード値を返します。equals () は 2 つのオブジェクトが等しいかどうかを返します。しかし、hashCode と equals のメソッドには Java の公式文書にいくつかの一般的な合意があります:
-
1、2 つのオブジェクトを equals () で比較して true を返す場合、2 つのオブジェクトの hashCode () メソッドは同じ結果を返さなければなりません。
-
2、2 つのオブジェクトを equals () で比較して false を返す場合、hashCode () メソッドが異なる値を返すことは要求されませんが、異なる値を返す方が良いです。ハッシュテーブルの性能を向上させるためです。
-
3、equals () メソッドをオーバーライドする場合、hashCode () メソッドもオーバーライドしなければなりません。equals メソッドが等しい場合、2 つのオブジェクトの hashcode が同じ値を返すことを保証するためです。
4.final は java でどのような役割を果たしますか?#
-
クラスを修飾すると継承できなくなります。
-
メソッドを修飾するとオーバーライドできなくなります。
-
変数を修飾すると定数になり、再代入できなくなります。
基本データ型の値は変更できず、参照データ型はアドレスを変更できませんが、アドレスが指すデータは変更可能です。final で修飾された変数の本質:final で修飾された変数は固定されたメモリを指し、このメモリ内の値は変更できません。5.java の Math.round (-1.5) は何ですか?#
答えは **-1** です。Round 関数は直接 0.5 を加え、その後切り捨てます。-1.5+0.5=-1 で、切り捨てると - 1 になります。
-1.4+0.5=-0.9 で切り捨てると - 1 になります。-1.6+0.5=-1.1 で切り捨てると - 2 になります。
6.String は基本データ型ですか?#
明らかに違います。String はオブジェクトであり、参照型です。Java の基本データ型は以下の通りです:
byte -
8 ビットの符号付き整数で、2 進数の補数表現です。
-
最小は - 128(-2^7)、最大は 127(2^7-1)、デフォルト値は 0 です。
-
byte 型は大規模な配列でスペースを節約するために使用され、主に整数の代わりに使用されます。byte 変数が占有するスペースは int 型の 4 分の 1 です。
-
例:byte a = 100、byte b = -50
short -
16 ビットの符号付き整数で、2 進数の補数表現です。
-
最小値は - 32768(-2^15)、最大値は 32767(2^15-1)、デフォルト値は 0 です。
-
short 変数が占有するスペースは int の半分です。
-
例:short s = 1000、short r = -20000
int -
32 ビットの符号付き整数で、2 進数の補数表現です。
-
最小値は - 2147483648(-2^31)、最大値は 2147483647(2^31-1)です。
-
デフォルト値は 0 で、一般的に整数型のデフォルトも 0 です。
long -
64 ビットの符号付き整数で、2 進数の補数表現です。
-
最小値は(-2^63)、最大値は(2^63-1)、デフォルト値は 0L です。
-
例:long a = 100000L、Long b = -200000L
-
この型は主に大きな整数を比較するシステムで使用されます。
float -
float は単精度、32 ビット、IEEE 754 標準の浮動小数点数です。
-
float は大規模な浮動小数点配列を保存する際にメモリを節約できます。
-
デフォルト値は 0.0f で、浮動小数点数は正確な値を表すためには使用できません(例えば、通貨など)。
-
例:float f1=0.2f
double -
double は倍精度、64 ビット、IEEE 754 標準の浮動小数点数です。
-
浮動小数点数のデフォルトは double で、同様に正確な値を表すことはできません。
-
デフォルト値は 0.0d です。
-
例:double d1=0.2d。
boolean -
boolean は 1 ビットの情報を表します。
-
値は true または false の 2 つだけです。
-
デフォルト値は false です。
-
例:boolean b = true
char -
char 型は 1 つの 16 ビット Unicode 文字です。
-
最小値は \u0000(つまり 0)、最大値は \uFFFF(65535)です。
-
char は任意の文字を保存できます。
-
例:char A='A';
上記の基本データ型情報は菜鳥教程から整理されています。7.java で文字列を操作するクラスは何ですか?それらの違いは何ですか?#
3 つのクラスはすべて char [] 形式で文字列を保存します。
-
String:変更をサポートしていません。変更は新しいオブジェクトを再作成することに相当します。
-
StringBuffer:スレッドセーフで、マルチスレッドで使用します。使用する必要はありません。
-
StringBuilder:スレッドセーフではありませんが、速く、シングルスレッドで使用します。
[](#8-String-str-"i" と - String-str-new-String-"i" は同じですか? "8.String str="i"と String str=new String ("i") は同じですか?") 8.String str="i" と String str=new String ("i") は同じですか?#
2 番目の問題に戻りますが、equals () は等しいですが、== 演算の結果は false です。なぜなら、str="i" のとき、Java 仮想マシンは "i" を定数プールに割り当てます。定数プールには重複する要素がないため、別の変数(例えば str2="i")がある場合、定数プール内の "i" のアドレスが str2 に割り当てられ、存在しない場合は新しいオブジェクトが作成されます。一方、new で作成されたオブジェクトはヒープメモリに割り当てられ、値は同じでもアドレスは異なります。
9. 文字列を反転させるにはどうすればよいですか?#
StringBuffer と StringBuilder の reverse () メソッドを使用します。または、char 配列に変換してループを行います。
10.String クラスの一般的なメソッドは何ですか?#
-
int indexOf()
-
int length(String ch)
-
String subString (int beginIndex,int endIndex)、包前不包後
-
String trim()
-
boolean equals()
-
toLowerCase(),toUpperCase()
-
char charAt(int index)
-
String [] split (String regex, int limit) 最初のパラメータは分割基準、2 番目は分割数です。
-
他にもたくさんありますが、書くのが面倒です… あまり使いません。
11. 抽象クラスには抽象メソッドが必要ですか?#
いいえ、abstract で修飾されたものは抽象クラスであり、抽象メソッドを含む必要はありません。抽象メソッドが 1 つでも含まれている場合は抽象クラスでなければなりません。抽象メソッドがなくてもインスタンス化できません。
12. 通常のクラスと抽象クラスの違いは何ですか?#
通常のクラスはインスタンス化できますが、抽象クラスはできません。抽象クラスのサブクラスは、抽象クラスのすべての抽象メソッドを実装する必要があります。ただし、そのサブクラスも抽象クラスである場合は除きます。
13. 抽象クラスは final で修飾できますか?#
絶対にNO! final で修飾されたものは継承できません。では、抽象クラスの意味は何ですか?抽象クラスは継承されるためのものではありませんか… 何の質問ですか。
14. インターフェースと抽象クラスの違いは何ですか?#
インターフェースは抽象クラスの抽象と理解できます。すべてが抽象メソッドです。クラスは 1 つの抽象クラスを継承できますが、複数のインターフェースを継承できます。これにより、多重継承が実現されます…。
15.java の IO ストリームは何種類に分かれますか?#
ついに私の知識の盲点に到達しました。。
入力ストリーム、出力ストリームはさらにバイトストリーム、文字ストリームに分かれ、さらにノードストリーム、処理ストリームに分かれます。 -
入力ストリーム
- 入力文字ストリーム Reader
- ノードストリーム FileReader、PipedReader、CharArrayReader
- 処理ストリーム BufferedReader、InputStreamReader
- 入力バイトストリーム InputStream
- ノードストリーム FileInputSteam、PipedInputStream、ByteArrayInputStream
- 処理ストリーム BufferedInputStream、DataInputStream、ObjectInputStream、SequenceInputStream
- 入力文字ストリーム Reader
-
出力ストリーム
- 出力文字ストリーム Writer
- ノードストリーム FileWriter、PipedWriter、CharArrayWriter
- 処理ストリーム BufferedWriter、OutputStreamWriter、PrintWriter
- 出力バイトストリーム OutputStream
- ノードストリーム FileOutputStream、PipedOutputStream、ByteArrayOutputStream
- 処理ストリーム BufferedOutputStream、DataOutputStream、ObjectOutputStream、PrintStream
- 出力文字ストリーム Writer
16.BIO、NIO、AIO の違いは何ですか?#
IO の方式は通常いくつかに分かれます。同期ブロッキングの BIO、同期ノンブロッキングの NIO、非同期ノンブロッキングの AIO。
これも盲点です~資料を調べてもあまり理解できません。さらに深く理解する必要があります。
17.Files の一般的なメソッドは何ですか?#
-
Files.exists () ファイルパスが存在するかどうかを検出します。
-
Files.createFile () ファイルを作成します。
-
Files.createDirectory () フォルダーを作成します。
-
Files.delete () ファイルを削除します。
-
Files.copy () ファイルをコピーします。
-
Files.move () ファイルを移動します。
-
Files.size () ファイルの数を確認します。
-
Files.read () ファイルを読み取ります。
-
Files.write () ファイルに書き込みます。
二、コンテナ#
java のコンテナは何ですか?#
List、Set、Map、queue、stack;
Collection と Collections の違いは何ですか?#
Collection は集合のインターフェースで、list、set などがそれを継承しています。
Collections はユーティリティクラス(sort、addAll、max)で、空の集合を作成します。List、Set、Map の違いは何ですか?#
List は順序付きリストで、配列に似ています。挿入順に保存されます。
Set は重複しない要素の集合を保存し、map の key のみを保存します。
Map は key-value ペアの形式です。HashMap と Hashtable の違いは何ですか?#
HashMap はスレッドセーフではなく、スレッドに安全ではありませんが、効率が良いです。1.2 以降にリリースされました。
Hashtable はほとんど使用されておらず、Properties は Hashtable から継承されています。また、キャメルケース命名が使用されていません。ハハハ。HashMap と TreeMap のどちらを使用するか決定するにはどうすればよいですか?#
key をソートする必要がない場合は HashMap を使用し、必要な場合は TreeMap を使用します。
HashMap の実装原理について説明してください。#
HashMap は配列とリンクリストの方式で実装されており、key に対して hashCode () 演算を行い、ハッシュ値を得て、配列の長さで剰余演算を行い、挿入する配列の位置を得ます。ハッシュ衝突を処理するためにリンクリストを使用します。同じインデックスに遭遇した場合、key の値が同じかどうかを確認します(equals)。もし同じであれば、key の値が同じであることを示し、元の value の値を置き換えます。異なる場合は、このリンクリストの次のノードに置きます。
HashSet の実装原理について説明してください。#
HashMap のラッパーであり、不変の Object を value として使用します。
ArrayList と LinkedList の違いは何ですか?#
ArrayList は基盤が配列で実装されており、LinkedList はリンクリストで実装されています。したがって、長所と短所も明らかです。ArrayList は検索が速いです。LinkedList は追加と削除が速いです。
配列と List の間の変換を実現するにはどうすればよいですか?#
配列を List に変換:Arrays.asList ()
List を配列に変換:list.toArray ()ArrayList と Vector の違いは何ですか?#
Vector はスレッドセーフなリストで、基本的には使用されていません。
Array と ArrayList の違いは何ですか?#
配列は基本データ型とオブジェクト型の両方を保存でき、1 種類だけを保存できます。ArrayList はオブジェクト型のみを保存できますが、ジェネリクスを使用しない場合は複数の型を保存できます。
ArrayList は動的配列に基づいて実装されており、サイズは固定されていません。Array は固定されています。ArrayList の拡張メカニズム#
ArrayList の拡張の本質は、新しい拡張配列のサイズを計算し、インスタンス化し、元の配列の内容を新しい配列にコピーすることです。
Queue 内の poll () と remove () の違いは何ですか?#
両方ともキューの先頭要素を削除して返しますが、remove はキューが空の場合にエラーを報告します(NoSuchElementException 例外をスローします)が、poll は false または null を返します。
スレッドセーフなコレクションクラスはどれですか?#
Vector、Hashtable、Stack
イテレータ Iterator とは何ですか?#
イテレータは、コレクションを遍歴するためのツールです。
Iterator はどのように使用しますか?特徴は何ですか?#
next は次の要素、hasNext は次があるかどうか、remove は返された要素を削除します。
Iterator と ListIterator の違いは何ですか?#
Iterator は set、map、list を遍歴できますが、ListIterator は List のみを遍歴できますが、前後に遍歴できます。
コレクションを変更できないようにするにはどうすればよいですか?#
Collections.unmodifiableList(List)
三、マルチスレッド#
並列と並行の違いは何ですか?#
-
並列:複数のプロセッサが同時に異なるタスクを処理します。これは物理的に同時に発生します。
-
並行:1 つのプロセッサが同時に複数のタスクを処理できます。これは論理的に同時に発生します。
例:並行:1 人が同時に 3 つのリンゴを食べる。並列:3 人が同時に 3 つのリンゴを食べる。スレッドとプロセスの違いは何ですか?#
プロセスは 1 つのタスクであり、スレッドはプロセスのサブタスクです。オペレーティングシステムがスケジュールする最小のタスク単位はスレッドです。
デーモンスレッドとは何ですか?#
デーモンスレッドは他のスレッドにサービスを提供するスレッドです。JVM では、すべての非デーモンスレッドが完了した後、デーモンスレッドが存在するかどうかにかかわらず、仮想マシンは自動的に終了します。
したがって、JVM が終了する際には、デーモンスレッドが終了しているかどうかを気にする必要はありません。スレッドを作成する方法は何ですか?#
- Thread クラスを継承してスレッドクラスを作成します:Thread からカスタムクラスを派生させ、run () メソッドをオーバーライドします。
- Runnable インターフェースを使用してスレッドクラスを作成します:Thread インスタンスを作成する際に、Runnable インスタンスを渡します。
- Callable と Future を使用してスレッドを作成します。
runnable と callable の違いは何ですか?#
1、上記のコードに示すように、callable のコアは call メソッドで、戻り値を許可しますが、runnable のコアは run メソッドで、戻り値はありません。
-
2、call メソッドは例外をスローできますが、run メソッドはできません。
3、runnable は java1.1 から存在しているため、戻り値は存在せず、後に java1.5 で最適化され、callable が登場し、戻り値と例外をスローできるようになりました。
スレッドにはどのような状態がありますか?#
-
New:新しく作成されたスレッドで、まだ実行されていません。
-
Runnable:実行中のスレッドで、run () メソッドの Java コードを実行しています。
-
Blocked:実行中のスレッドで、何らかの操作によってブロックされて一時停止しています。
-
Waiting:実行中のスレッドで、何らかの操作を待っています。
-
Timed Waiting:実行中のスレッドで、sleep () メソッドを実行して時間待ちをしています。
-
Terminated:スレッドが終了しており、run () メソッドが完了しています。
sleep () と wait () の違いは何ですか?#
notify () と notifyAll () の違いは何ですか?#
スレッドの run () と start () の違いは何ですか?#
スレッドプールを作成する方法は何ですか?#
スレッドプールにはどのような状態がありますか?#
スレッドプール内の submit () と execute () メソッドの違いは何ですか?#
java プログラムでマルチスレッドの安全な実行を保証するにはどうすればよいですか?#
マルチスレッドロックの昇格原理は何ですか?#
デッドロックとは何ですか?#
デッドロックを防ぐにはどうすればよいですか?#
ThreadLocal とは何ですか?どのような使用シーンがありますか?#
synchronized の底層実装原理について説明してください。#
synchronized と volatile の違いは何ですか?#
synchronized と Lock の違いは何ですか?#
synchronized と ReentrantLock の違いは何ですか?#
atomic の原理について説明してください。#
四、リフレクション#
リフレクションとは何ですか?#
リフレクションとは Reflection のことで、Java のリフレクションはプログラムが実行時にオブジェクトのすべての情報を取得できることを指します。これは、実行時に特定のインスタンスについて何も知らない場合に、そのメソッドを呼び出す方法を解決するためのものです。リフレクションは、Java が動的(または準動的)言語と見なされるための重要な特性です。このようにして Class インスタンスを取得してクラス情報を取得する方法をリフレクション(Reflection)と呼びます。
java シリアライズとは何ですか?どのような場合にシリアライズが必要ですか?#
オブジェクトを io に置き、serializable インターフェースを実装します。
シリアライズは、Java オブジェクトをバイナリコンテンツに変換することを指し、本質的には byte [] 配列です。動的プロキシとは何ですか?どのようなアプリケーションがありますか?#
JDK が提供するインターフェースオブジェクトを動的に作成する方法を動的プロキシと呼びます。
実装クラスを記述せず、実行時に特定のインターフェースのインスタンスを直接作成します。
Proxy を使用してプロキシオブジェクトを作成し、インターフェースメソッドを InvocationHandler handler にプロキシします。動的プロキシのアプリケーションには、spring aop、hibernate データクエリ、テストフレームワークのバックエンドモック、rpc、Java アノテーションオブジェクト取得などがあります。動的プロキシを実現するにはどうすればよいですか?#
- InvocationHandler インスタンスを定義し、それがインターフェースのメソッド呼び出しを実装します。
- Proxy.newProxyInstance () を使用してインターフェースインスタンスを作成します。これは 3 つのパラメータを必要とします:
- 使用する ClassLoader、通常はインターフェースクラスの ClassLoader です。
- 実装するインターフェースの配列、少なくとも 1 つのインターフェースを渡す必要があります。
- インターフェースメソッド呼び出しを処理する InvocationHandler インスタンス。
- 戻り値の Object をインターフェースに強制的にキャストします。
五、オブジェクトコピー#
なぜクローンを使用するのですか?#
オブジェクトクローンを実現するにはどうすればよいですか?#
cloneable インターフェースを実装し、clone () をオーバーライドします。
深いコピーと浅いコピーの違いは何ですか?#
浅いコピーは参照オブジェクト属性が元のオブジェクトのメモリアドレスを指します。
深いコピーは完全に新しいもので、参照する他のオブジェクトもコピーされます。
六、Java Web#
jsp と servlet の違いは何ですか?#
jsp はフロントエンドページを表し、servlet はサーバー側とブラウザの中間層であり、実行時に jsp は web コンテナ(tomcat)によって servlet にコンパイルされます。
jsp にはどのような組み込みオブジェクトがありますか?それぞれの役割は何ですか?#
-
request ユーザー端からのリクエスト。このリクエストには GET/POST リクエストのパラメータが含まれます。
-
response ユーザー端に返されるウェブページの応答。
-
pageContext ウェブページの属性がここで管理されます。
-
session リクエストに関連するセッション期間。
-
application servlet が実行中の内容。
-
out 応答の出力を送信するために使用されます。
-
config servlet の構造部品。
-
page JSP ウェブページ自体。
-
exception エラーページに対して、未捕捉の例外。
jsp の 4 つのスコープについて説明してください。#
名前 スコープ application すべてのアプリケーションに有効 session 現在のセッション全体に有効 request 現在のリクエストに有効 page 現在のページに有効
session と cookie の違いは何ですか?#
一般的に、cookie は sessionid を記録します。session はサーバー側で、cookie はクライアント側です。
session の動作原理について説明してください。#
サーバーが session オブジェクトを作成した後、session オブジェクトの id を cookie 形式でクライアントに返します。こうすることで、ユーザーが現在のブラウザを保持してサーバーにアクセスすると、session の id がサーバーに送信され、サーバーは session の id に基づいてユーザーに相応のサービスを提供します。
クライアントが cookie を禁止した場合、session はまだ使用できますか?#
可能です。URL を介して sessionid を渡すだけです。
[](#spring mvc と struts の違いは何ですか? "spring mvc と struts の違いは何ですか?") spring mvc と struts の違いは何ですか?#
sql インジェクションを防ぐにはどうすればよいですか?#
PreparedStatement を使用して?プレースホルダーを使用するか、名前付き変数の方法を使用します。
XSS 攻撃とは何ですか?どう防ぐことができますか?#
CSRF 攻撃とは何ですか?どう防ぐことができますか?#
七、例外#
throw と throws の違いは何ですか?#
throws はメソッドの後ろにあり、このメソッドが例外をスローする可能性があることを示します。このメソッドを呼び出すときは try catch を使用するか、例外をスローする必要があります。throw はメソッド内で使用され、一般的には catch 内で記述されます。
final、finally、finalize の違いは何ですか?#
final はメソッドを修飾するとオーバーライドできず、クラスを修飾すると継承できず、変数を修飾すると定数になります。
finally は try catch の後にあります。
finalize () は object の中のメソッドで、JVM がオブジェクトが死亡したと判断したときに呼び出されます(例えば、このメソッドをオーバーライドして gc roots に再導入すると、GC アルゴリズムはそれを回収しません)。
try-catch-finally のどの部分を省略できますか?#
catch と finally のどちらかを省略できます。
try-catch-finally の中で、catch の中で return した場合、finally はまだ実行されますか?#
実行されます。return 式の後に実行されます。その変更は変わりません。
一般的な例外クラスにはどのようなものがありますか?#
Error、runtime Exception、Exception、throw
八、ネットワーク#
http レスポンスコード 301 と 302 は何を表しますか?違いは何ですか?#
301リダイレクト:301は永久的な移動を表します(Permanently Moved)
302リダイレクト:302は一時的な移動を表します(Temporarily Moved)
forward と redirect の違いは何ですか?#
tcp と udp の違いを簡潔に説明してください。#
TCP:接続指向で、信頼性があり、失われず、重複せず、順序通りです。三回のハンドシェイク。バイト指向です。
UDP:接続なしで、信頼性がありません。メッセージ指向ですが、速く、ブロードキャストできます。
tcp はなぜ三回のハンドシェイクを行うのですか?二回では不十分ですか?なぜですか?#
不十分です。二回では片方向の接続が通過していることしか保証できず、双方向が通過していることは保証できません。
tcp の粘着パケットはどのように発生しますか?#
アプリケーションがキャッシュ内のデータパケットを読み取る速度が受信データパケットの速度よりも遅く、キャッシュ内の複数のデータパケットがアプリケーションによって 1 つのパケットとして読み取られます。
OSI の 7 層モデルにはどのようなものがありますか?#
アプリケーション層
プレゼンテーション層
セッション層
トランスポート層
ネットワーク層
データリンク層
物理層
get と post リクエストの違いは何ですか?#
get はサーバーからデータを取得し、post はサーバーにデータを送信します。
クロスオリジンを実現するにはどうすればよいですか?#
JSONP の実現原理について説明してください。#
九、デザインパターン#
あなたが知っているデザインパターンについて説明してください。#
抽象ファクトリーパターン
シンプルファクトリーと抽象ファクトリーの違いは何ですか?#
シンプルファクトリーは複雑さが小さいオブジェクトを処理し、抽象ファクトリーは複雑さが大きいものを処理します。
シンプルファクトリーパターンは実際の工場 - 抽象クラス - 異なる製品を実装します。
抽象ファクトリーは抽象工場 - 異なる工場(異なる製品ファミリーの製品を実装) - 異なる製品(製品の抽象クラスを継承)です。
十、Spring/Spring MVC#
なぜ spring を使用するのですか?#
開発の複雑さを軽減し、他のフレームワーク(Mybatis、Hibernate)との統合を容易にし、無駄な輪を作るのを避け、ビジネスロジックに集中します。
AOP をサポートし、アスペクト指向プログラミングを行い、ログ、トランザクション、安全性など、ビジネスロジックとは関係のないが複数のビジネスにまたがるコンポーネントを個別に分離して再利用可能なコンポーネントを形成します。
AOP とは何ですか?#
AOP は Aspect Oriented Programming(アスペクト指向プログラミング)の略です。
まず、アスペクト指向プログラミングの考え方では、機能をコアビジネス機能と周辺機能に分けます。
コアビジネスとは、ログイン、データの追加、データの削除などのコアビジネスを指します。
周辺機能とは、パフォーマンス統計、ログ、トランザクション管理などです。
周辺機能は Spring のアスペクト指向プログラミング AOP の考え方でアスペクトとして定義されます。
アスペクト指向プログラミング AOP の考え方では、コアビジネス機能とアスペクト機能はそれぞれ独立して開発されます。
そして、アスペクト機能とコアビジネス機能を「織り交ぜる」ことを AOP と呼びます。
IOC とは何ですか?#
制御の反転
簡単に言えば、オブジェクトの作成は以前のプログラマーが自分で new コンストラクタを呼び出すのではなく、Spring にオブジェクトを作成させることです。
spring の主要なモジュールは何ですか?#
1.Spring Core
フレームワークの最も基本的な部分で、IOC コンテナを提供し、bean を管理します。
2.Spring Context
bean に基づいて、コンテキスト情報を提供し、JNDI、EJB、電子メール、国際化、検証、スケジューリングなどの機能を拡張します。
3.Spring DAO
JDBC の抽象層を提供し、冗長な JDBC コーディングとデータベースベンダー固有のエラーコードの解析を排除し、宣言的なトランザクション管理方法を提供します。
4.Spring ORM
オブジェクト / リレーショナルマッピング API の統合層を提供します。これには JPA、JDO、Hibernate、MyBatis などが含まれます。
5.Spring AOP
AOP Alliance 仕様に準拠したアスペクト指向プログラミングの実装を提供します。
6.Spring Web
基本的な Web 開発のコンテキスト情報を提供し、他の Web と統合できます。
7.Spring MVC
Web アプリケーションの Model-View-Controller の完全な実装を提供します。
spring の一般的な注入方法は何ですか?#
コンストラクタ注入、
setter 注入
アノテーション注入
spring の bean はスレッドセーフですか?#
コンテナ自体はスレッドセーフな戦略を提供しておらず、スレッドセーフな特性を持っていません。具体的なスコープの Bean を分析する必要があります。
(bean の作用域スコープ:singleton、prototype、request、session、global session)
プロトタイプパターン prototype:毎回新しいオブジェクトを作成し、各スレッドはそれぞれのものを使用し、共有しないため、スレッドセーフの問題はありません。
シングルトンパターン singleton:無状態の bean であれば、つまりこの bean を呼び出しても状態(フィールド属性)が変わらない場合は安全です。メソッド自体だけです。有状態の bean の場合は、最も簡単な方法はプロトタイプパターンに変更することです。
Spring が作成する bean はデフォルトで singleton であり、スレッドが特定の bean を呼び出すとき、各スレッドは自分の空間に bean オブジェクトのコピーを持ちます。コードの実行速度が非常に速いため、スタックフレームの生存時間は非常に短く、瞬時に生滅します。したがって、ローカル変数は外部で使用できません。この bean オブジェクトのグローバル変数を呼び出すと、スレッドセーフの問題が発生します(この場合、bean を prototype として定義する必要があります)。
spring はどのような bean の作用域をサポートしていますか?#
-
singleton モード:シングルトンモードで、Spring ioc コンテナ全体で singleton で定義された bean は 1 つのインスタンスしかありません。
-
prototype:プロトタイプモードで、コンテナの getbean メソッドを介して取得される prototype で定義された bean は毎回新しいインスタンスを生成します。
-
web アプリケーションで Spring を使用する場合、request、session、global-session の作用域のみが有効です。
-
request:各 HTTP リクエストに対して、request で定義された bean は毎回インスタンスを生成します。つまり、各 HTTP リクエストごとに異なる bean インスタンスが生成されます。
-
session:同じセッションで 1 つの bean インスタンスを共有します。
-
global-session:session スコープとは異なり、すべてのセッションが 1 つのインスタンスを共有します。
spring の bean の自動配線方法は何ですか?#
spring 設定ファイルのノードの autowire パラメータは、bean の自動配線方法を制御できます。
-
default - デフォルトの方法で、「no」方式と同じです。
-
no:デフォルト方式で、手動配線方式で、を介して bean の依存関係を設定する必要があります。
-
byName:bean の名前に基づいて配線します。bean の名前が他の bean の属性と一致する場合、自動配線されます。
-
byType:bean のタイプに基づいて配線します。bean の属性タイプが他の bean の属性のデータタイプと一致する場合、自動配線されます。
-
constructor:コンストラクタに基づいて配線します。byType と似ています。bean のコンストラクタに他の bean タイプと同じ属性がある場合、自動配線されます。
-
autodetect:デフォルトコンストラクタがある場合は constructor 方式で配線し、そうでない場合は byType 方式で配線します。
spring のトランザクション実装方法は何ですか?#
(1)プログラムによるトランザクション管理は、POJO ベースのアプリケーションにとって唯一の選択肢です。コード内で beginTransaction ()、commit ()、rollback () などのトランザクション管理関連のメソッドを呼び出す必要があります。これがプログラムによるトランザクション管理です。
(2)TransactionProxyFactoryBean に基づく宣言的トランザクション管理
(3)@Transactional に基づく宣言的トランザクション管理
(4)Aspectj AOP に基づくトランザクション設定spring のトランザクション隔離について説明してください。#
読み取り未コミット;
読み取りコミット;
可再現読み取り;
シリアライズ;[](#spring mvc の実行フローについて説明してください。 "spring mvc の実行フローについて説明してください。") spring mvc の実行フローについて説明してください。#
- ユーザーがリクエストをフロントコントローラー DispatcherServlet に送信します。
2.DispatcherServlet はリクエストを受け取り、ハンドラーマッピング HandlerMapping を呼び出します。 - ハンドラーマッピングはリクエスト URL に基づいて具体的なハンドラーを見つけ、ハンドラー実行チェーン HandlerExecutionChain(ハンドラーオブジェクトとハンドラーインターセプターを含む)を生成し、DispatcherServlet に返します。
4.DispatcherServlet はハンドラー Handler からハンドラーアダプター HandlerAdapter を取得し、ハンドラーアダプターがパラメータの封装、データ形式の変換、データ検証などの一連の操作を処理します。 - ハンドラー Handler(コントローラーとも呼ばれます)を実行します。
6.Handler が実行を完了し、ModelAndView を返します。
7.HandlerAdapter は Handler の実行結果 ModelAndView を DispatcherServlet に返します。
8.DispatcherServlet は ModelAndView を ViewResolver ビューリゾルバーに渡します。
9.ViewResolver が解析し、具体的な View を返します。
10.DispatcherServlet は View をレンダリングします(つまり、モデルデータ model をビューに埋め込みます)。
11.DispatcherServlet はユーザーに応答します。
自己理解としては、V から C、M、C、再び V のプロセスを説明できます。
[](#spring mvc のコンポーネントは何ですか? "spring mvc のコンポーネントは何ですか?") spring mvc のコンポーネントは何ですか?#
フロントコントローラー DispatcherServlet
ハンドラーマッピング HanderMapping
ハンドラーアダプター HaderAdapter
ビューリゾルバー ViewResolver
例外処理器 HandlerExceptionResolver
ビューコンポーネント View
@RequestMapping の役割は何ですか?#
リクエストアドレスマッピングを処理するためのアノテーションで、クラスまたはメソッドに使用できます。クラスに使用されると、そのクラス内のすべての応答リクエストメソッドがそのアドレスを親パスとして使用します。
@Autowired の役割は何ですか?#
自動配線アノテーション:クラスのメンバー変数、メソッド、およびコンストラクタにマークを付け、Spring が bean の自動配線を行うようにします。
十一、Spring Boot/Spring Cloud#
[](#spring boot とは何ですか? "spring boot とは何ですか?") spring boot とは何ですか?#
“springboot は Spring オープンソースフレームワークのサブプロジェクトであり、Spring のワンストップソリューションであり、主に Spring の使用の難易度を簡素化し、設定ファイルの要件を低減し、開発者がより簡単に取り組むことができるようにします。”
spring boot は大きなフレームワークの中に多くのものを含んでおり、その中で spring は最もコアな内容の 1 つです。
[](# なぜ spring boot を使用するのですか? "なぜ spring boot を使用するのですか?") なぜ spring boot を使用するのですか?#
Spring の使用の難易度を簡素化します。さまざまなフレームワーク、WEB コンテナなどを統合します。
[](#spring boot のコア設定ファイルは何ですか? "spring boot のコア設定ファイルは何ですか?") spring boot のコア設定ファイルは何ですか?#
application.properties&&bootstrap.properties
application.yml&&bootstrap.yml
bootstrap 設定ファイルはシステムレベルのもので、外部設定を読み込むために使用されます。設定センターの設定情報を読み込むためにも使用され、システムが変わらない属性を定義するためにも使用できます。bootstatp ファイルの読み込みは application ファイルよりも先に行われます。
application 設定ファイルはアプリケーションレベルのもので、現在のアプリケーションの設定ファイルです。
properties は key=value、bootstrap は keyです。
[](#spring boot の設定ファイルにはどのような種類がありますか?それらの違いは何ですか? "spring boot の設定ファイルにはどのような種類がありますか?それらの違いは何ですか?") spring boot の設定ファイルにはどのような種類がありますか?それらの違いは何ですか?#
前の質問
[](#spring boot にはどのような方法でホットデプロイを実現できますか? "spring boot にはどのような方法でホットデプロイを実現できますか?") spring boot にはどのような方法でホットデプロイを実現できますか?#
デバッグモード Debug を使用してホットデプロイを実現します。
spring-boot-devtools
Spring Loaded
JRebel
jpa と hibernate の違いは何ですか?#
Hibernate ORM は JPA 仕様の実装の 1 つです。
Java Persistence API
JPA は Java プログラミング言語インターフェース仕様で、標準 JAVA プラットフォームと JAVA エンタープライズバージョンの関係型データの管理を記述します。JPA API は JAVA コミュニティエキスパートグループの JSR220 の一部であり、JPA2.0 は JSR317 エキスパートグループの作業です。
[](#spring cloud とは何ですか? "spring cloud とは何ですか?") spring cloud とは何ですか?#
Spring Cloud は、開発者が分散システムの一般的なパターン(例:設定管理、サービス発見、回路ブレーカー、インテリジェントルーティング、マイクロプロキシ、コントロールバス、一時トークン、グローバルロック、リーダー選挙、分散セッション、クラスター状態)を迅速に構築するためのツールを提供します。
分散システムの調整はボイラープレートパターンを生み出し、Spring Cloud を使用することで、開発者はこれらのパターンを実装するサービスやアプリケーションを迅速に立ち上げることができます。
これらは、開発者自身のラップトップ、ベアメタルデータセンター、Cloud Foundry などの管理プラットフォームを含む、任意の分散環境でうまく機能します。
Spring Cloud の公式ウェブサイトによると、Spring Cloud は開発者が分散システムの一般的なパターンを迅速に構築するためのツールを提供します(例:設定管理、サービス発見、回路ブレーカー、インテリジェントルーティング、リーダー選挙、分散セッション、クラスター状態)。分散システム間の調整は、いくつかのボイラープレートパターンを生み出し、開発者は Spring Cloud を使用してこれらのパターンに基づくサービスやアプリケーションを迅速に構築できます。
[](#spring cloud の回路ブレーカーの役割は何ですか? "spring cloud の回路ブレーカーの役割は何ですか?") spring cloud の回路ブレーカーの役割は何ですか?#
あるサービスが別のサービスを呼び出す際に、ネットワークの理由や自身の理由で問題が発生した場合、呼び出し元は呼び出し先の応答を待つことになります。
これにより、より多くのサービスリクエストがこれらのリソースに到達し、より多くのリクエストが待機することになります。
これにより、連鎖的な効果(雪崩効果)が発生します。回路ブレーカーはこの問題を解決するためのものです。
[](#spring cloud のコアコンポーネントは何ですか? "spring cloud のコアコンポーネントは何ですか?") spring cloud のコアコンポーネントは何ですか?#
-
サービス発見 ——Netflix Eureka
AWS リージョンで実行されている中間層サービスを特定するための RESTful サービスです。2 つのコンポーネントで構成されています:Eureka サーバーと Eureka クライアント。Eureka サーバーはサービス登録サーバーとして機能します。Eureka クライアントは Java クライアントで、サーバーとの相互作用を簡素化し、ラウンドロビン負荷分散器として機能し、サービスのフェイルオーバーをサポートします。Netflix はその生産環境で別のクライアントを使用しており、トラフィック、リソース利用率、エラー状態に基づいて重み付けされた負荷分散を提供します。
-
クライアント負荷分散 ——Netflix Ribbon
Ribbon クライアントコンポーネントは、接続タイムアウト、リトライ、リトライアルゴリズムなどの一連の完全な設定オプションを提供します。Ribbon はプラグイン可能でカスタマイズ可能な負荷分散コンポーネントを内蔵しています。
-
回路ブレーカー ——Netflix Hystrix
回路ブレーカーは、アプリケーションが操作を何度も試みるのを防ぎ、失敗する可能性が高い場合は、失敗を待つことなく続行できるようにします。回路ブレーカーパターンは、アプリケーションが障害が解決されたかどうかを検出できるようにします。問題が解決されたように見える場合、アプリケーションは操作を呼び出すこと