71. Enum の toString() メソッドをオーバーライドしないとどうなりますか?
次の列挙型があるとします。public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
生徒に対してtoString()を呼び出して、コンソールに生徒を表示してみましょう。
System.out.println(Role.STUDENT.toString());
コンソールに表示される結果は次のとおりです。
72. Enum内にコンストラクタを指定することは可能ですか?
はい、確かに。内部 enum 変数の値はコンストラクターを通じて設定されます。例として、各役割の年齢範囲を示すために、 前の列挙型に 2 つのフィールド ( ageFromとageTo )を追加してみましょう。public enum Role {
STUDENT(5,18),
TEACHER(20,60),
DIRECTOR(40,70),
SECURITY_GUARD(18,50);
int ageFrom;
int ageTo;
Role(int ageFrom, int ageTo) {
this.ageFrom = ageFrom;
this.ageTo = ageTo;
}
}
73. ==とequals()の違いは何ですか?
これは、Java 開発者の面接で最も一般的な質問の 1 つです。変数には特定の値が含まれており、それらを比較できるため、単純な値 ( int、char、double ...) を比較する場合、 ==を使用して比較するという事実から始めましょう。また、プリミティブ変数は本格的なオブジェクトではありません。これらはObjectを継承せず、 equals()メソッドを持ちません。オブジェクトを参照する変数の比較について話す場合、== は参照の値 (同じオブジェクトを参照しているかどうか) のみを比較します。また、あるオブジェクトが別のオブジェクトと同一であっても、これは別のオブジェクトであるため、==による比較では負の結果 ( false ) が得られます。ご存知のとおり、equals()メソッドは参照変数を比較するために使用されます。これはObjectクラスの標準メソッドの 1 つで、オブジェクトの完全な比較に必要です。ただし、すぐに明確にする価値があります。このメソッドが正しく機能するには、このクラスのオブジェクトをどのように比較するかを正確に記述して再定義する必要があります。メソッドをオーバーライドしない限り、デフォルトでは==によってオブジェクトを比較します。IntelliJ IDEAでは、(IDEA ツールを使用して) これを自動的にオーバーライドできます -> alt + insert、表示されるウィンドウで、equals() と hashCode()を選択します-> どのクラス フィールドが参加するかを選択します -> 自動的に実装されますメソッドが完成しました。以下は、 2 つのフィールド ( int ageとString name)を持つ単純なCatクラスに対して、自動的に生成されたequalsメソッドがどのようになるかを示す例です。@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
final Cat cat = (Cat) o;
return this.age == cat.age &&
Objects.equals(this.name, cat.name);
}
enumの==と等しいの 違いについて言えば、それほど多くはありません。結局のところ、enum は定数を格納し、==を使用して同様の値を比較する場合でも、参照は常に同じオブジェクトへのものであるため、trueを受け取ります。さて、equals を使用する場合、機能も正しく計算されます。特に、enumのequalsメソッドの本体に入ると、 Enumクラスでのメソッドの実装が次のようになっていることがわかります。内部 - 参考による古き良き比較! 要約すると、enumの場合、==と等しいの両方による比較は正しいです。
74. Enum の ordinal() メソッドは何をしますか?
enum要素でint ordinal()メソッドを呼び出すと、一般的な列挙型のこの値の 0 からの序数が取得されます。前述の列挙型の 1 つの要素( Role)でこのメソッドを使用してみましょう。System.out.println(Role.DIRECTOR.ordinal());
したがって、コンソールには次のように表示されます。
75. Java で TreeSet または TreeMap で Enum を使用することはできますか?
TreeSetおよびTreeMapでの列挙型の使用は許容されます。そして次のように書くことができます:TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
そして、コンソールには次のように表示されます。
76. Enum では ordinal() メソッドと CompareTo() メソッドはどのように関連していますか?
前に述べたように、ordinal() は一般的な列挙リスト内の値の序数を返します。また、前の質問の分析では、たとえばTreeSet (並べ替えられたセット) 内の列挙型の要素は、 enumで宣言された順序を取ることが分かりました。ご存知のとおり、TreeSetとTreeMap はComparableインターフェイスのCompareTo()メソッドを呼び出して要素を並べ替えます。このことから、 EnumクラスがComparableインターフェイスを実装し、 compareTo()メソッドに実装し、その中でordinal()を使用して並べ替え順序を設定していると想定できます。Enumクラスに入ると、次の確認が表示されます。そして、メソッド自体の本体: ordinal()メソッドはここでは呼び出されません。代わりに、序数変数、つまり列挙内の要素の序数が使用されます。ordinal()メソッド自体は、順序変数のゲッターにすぎません。77. EnumM の例を書く
上で説明した質問で、列挙型の例をすでに示しましたが、コードを複製する意味がわかりません (たとえば、列挙型のコンストラクターに関する質問番号 72)。78. スイッチケースでEnumを使用することは可能ですか?
それは可能であり、必要なことです!私の実践を振り返ってみると、enum を使用する最も一般的な場所の 1 つはswitchのような論理構造であることに気付きました。この場合、 case の可能なすべてのバリエーションを提供でき、すべてのenum値のロジックを記述した後、デフォルトの演算子を使用する必要さえなくなる可能性があります。結局のところ、たとえばint型のStringまたは数値を使用すると、予期しない値を受け取る可能性があり、 enumを使用することは不可能です。前に説明した例の スイッチは次のようになります。public void doSomething(Role role) {
switch (role) {
case STUDENT:
// некая логика для STUDENT
break;
case TEACHER:
// некая логика для TEACHER
break;
case DIRECTOR:
// некая логика для DIRECTOR
break;
case SECURITY_GUARD:
// некая логика для SECURITY_GUARD
break;
}
}
79. Enum インスタンスで利用可能なすべての値を取得するにはどうすればよいですか?
enum のすべてのインスタンスを取得する必要がある場合は、特定のenumで使用可能なすべての値の配列を自然な順序 ( enumで指定された順序) で返す、 values()メソッドがあります。例:Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
コンソールには次の出力が表示されます。
ストリームAPI
80.Javaのストリームとは何ですか?
Java Stream は、データ ストリームを操作する比較的新しい方法です。これにより、大規模なデータをより便利かつコンパクトに処理できるほか、特定の数のスレッド間でデータ処理を並列化できるため、使用時のパフォーマンスが向上します。機能性。このトピックを一言でこれ以上深く説明することはできません。そのため、このトピックを詳しく理解するのに役立つ記事へのリンクをここに残しておきます。81. トランザクションの主な特性は何ですか?
このトピックは Stream API と呼ばれていますが、質問はトランザクションに関するものです。うーん...まず、トランザクションとは何かを理解しましょう。 トランザクションは、データを操作する論理単位を表す一連の一連のデータベース操作です。トランザクションは、データの整合性を維持し、並行して実行されている他のトランザクションから独立して完全に正常に完了することも、まったく完了できない場合は効果がありません。したがって、トランザクションには 4 つの主要なプロパティがあり、これらは略してACIDと呼ばれます。この略語の各文字がどのように表されるかを見てみましょう。 A - 原子性 - 原子性- このプロパティは、トランザクションがシステムに部分的に記録されないことを保証します。そのサブ操作がすべて実行されるか、何も実行されません ( all or nothing )。 C - 一貫性 - 一貫性は、成功した各トランザクションが有効な結果のみを記録することを保証するプロパティです。つまり、これは、トランザクションが成功した場合、システムが特定のデータに課すすべてのルールと制限が満たされることを保証します。満たさない場合、トランザクションは完了せず、システム内のデータは以前の状態に戻ります。州。 I - 分離 - 分離は、トランザクションの実行中に並列トランザクションがその結果に影響を与えてはならないというプロパティです。この特性はリソースを大量に消費するため、通常は、特定の断熱問題を解決する特定のレベルの断熱を許可することによって部分的に実装されます。これについては次の質問で詳しく説明します。D - 耐久性 -このプロパティにより、ユーザーは、トランザクションが完了したというシステムからの確認を受け取った場合、何らかの障害によって加えた変更がキャンセルされないことを保証できます。つまり、トランザクションが正常に完了したという確認をすでに受け取っていれば、オペレーティング システムに何らかの障害が発生してもデータには何も影響しないと確信できます。82. トランザクション分離レベルとは何ですか?
前に述べたように、ACID 分離の提供はリソースを大量に消費するプロセスです。したがって、この特性は部分的に満たされます。分離にはさまざまなレベルがあり、レベルが高いほど生産性への影響が大きくなります。トランザクション分離レベルに進む前に、トランザクション分離が不十分であることによるさまざまな問題を検討する必要があります。-
ファントム読み取り- 同じサンプル (同じクエリ) が同じトランザクション内で繰り返し呼び出される場合、受信したデータが異なります。これは、別のトランザクションによるデータ挿入が原因で発生します。
-
非反復読み取り- 同じサンプル (同じクエリ) が同じトランザクション内で繰り返し呼び出される場合、受信したデータは異なります。これは、別のトランザクションによるデータの変更 (更新) や削除が原因で発生します。
-
ダーティ読み取り- その後確認されない (ロールバックされる) トランザクションによって追加または変更されたデータを読み取るプロセス。無効なデータの読み取り。
-
更新の喪失- 異なるトランザクションが同じデータを同時に変更すると、最後の変更を除くすべての変更が失われます (マルチスレッド環境における「競合状態」問題を思い出させます)。
分離レベル | ファントムリーディング | 繰り返しのない読書 | 汚い読書 | アップデートが失われました |
---|---|---|---|---|
シリアル化可能 | + | + | + | + |
反復読み取り | - | + | + | + |
コミットされた読み取り | - | - | + | + |
コミットされていない読み取り | - | - | - | + |
なし | - | - | - | - |
83. Statement と PreparedStatement の違いは何ですか?
そして、ここではJDBCテクノロジの機能への移行があまりスムーズではありません。そこで、まずStatement が実際に何であるかを理解しましょう。これは、SQL クエリを生成するために使用されるオブジェクトです。JDBC は、Statement、PreparedStatement、CallableStatementの3 つのタイプを使用します。 今日はCallableStatementについては説明しません。 StatementとPreparedStatementの違いについて話しましょう。-
ステートメントは、動的に挿入される受信パラメータを使用せずに単純な SQL クエリを実行するために使用されます。PrepareStatement は、入力パラメータを動的に挿入する機能とともに使用されます。
-
PreparedStatementでパラメータを設定するには、リクエスト内の入力パラメータを疑問符として記述し、 setDouble()、 setFloat() 、 setInt() 、setTime ( )などのさまざまなセッターを使用して値の代わりに値を挿入します。 .. その結果、間違ったタイプのデータをクエリに挿入することがなくなります。
-
PreparedStatementは「プリコンパイル」されており、キャッシュを使用するため、 Statementオブジェクトからクエリを実行するよりも実行がわずかに高速になります。その結果、頻繁に実行される SQL クエリはPreparedStatementオブジェクトとして書き込まれ、パフォーマンスが向上します。
-
Statementは SQL インジェクションに対して脆弱ですが、PreparedStatement はSQLインジェクションを防ぎます。SQL インジェクションの排除と Java セキュリティにおけるその他のベスト プラクティスについて詳しくは、この記事をご覧ください。
GO TO FULL VERSION