
71. Enum の toString() メソッドをオーバーライドしないとどうなりますか?
次の列挙型があるとします。public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
toString()メソッドを呼び出して、コンソールにSTUDENTフィールド を表示してみましょう。
System.out.println(Role.STUDENT.toString());
その結果、次のコンソール出力が得られます。
72. Enum 内でコンストラクターを宣言できますか?
はい、もちろん。コンストラクターは、 enumの内部フィールドの値を設定するものです。例として、各役割の年齢範囲を示すために、 前の列挙型( ageFromとageTo ) に 2 つのフィールドを追加してみましょう。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()メソッドを持ちません。オブジェクトを参照する変数の比較について話している場合、== は参照の値、つまり参照が同じオブジェクトを参照しているかどうかのみを比較することを知っておく必要があります。1 つのオブジェクト内のすべてのデータが別のオブジェクト内のすべてのデータと同一である場合でも、これらは別のオブジェクトであるため、比較に==を使用すると負の結果 ( false ) が返されます。ご想像のとおり、参照変数を比較するには、 equals()メソッドを使用します。これはObjectクラスの標準メソッドの 1 つであり、オブジェクトの本格的な比較に必要です。ただし、このメソッドが正しく機能するためには、オブジェクトを比較する方法を正確に示すためにメソッドをオーバーライドする必要があることをすぐに言っておきます。メソッドをオーバーライドしない場合は、== を使用してオブジェクトを比較するデフォルトの実装が取得されます。IntelliJ IDEA では、IDEA ショートカットAlt+Insertを使用して自動的にオーバーライドできます。表示されるウィンドウで、「equals()」と「hashCode()」を選択します。次に、関係するフィールドを選択します。出来上がり!メソッドは自動的に実装されます。以下は、自動生成された等しいメソッドが、2 つのフィールド ( int ageとString name )を持つ最も単純なCatクラスを検索する方法の例です。@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 に関しては、 ==とquals()の間に実質的な違いはありません。 


74. Enum の ordinal() メソッドは何をしますか?
enumフィールドでint ordinal()メソッドを呼び出すと、enum 値のリスト内のフィールドの 0 から始まるインデックスが取得されます。以前に検討した、 Role列挙型のフィールドでこのメソッドを呼び出してみましょう。System.out.println(Role.DIRECTOR.ordinal());
したがって、コンソールには次のように表示されます。
75. Enum は Java の TreeSet または TreeMap で使用できますか?
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() はenum フィールドのリスト内のフィールドのインデックスを返します。また、前の質問の考察で、 enum フィールドが TreeSet (ソートされたセット) に配置されると、 enumで宣言された順序が適用されることが分かりました。ご存知のとおり、TreeSetとTreeMap はComparableインターフェイスのCompareTo()メソッドを呼び出すことで項目を並べ替えます。これは、EnumクラスがComparableインターフェイスを実装していること、つまり、内部でordinal()メソッドを使用して並べ替え順序を決定するCompareTo()メソッドを実装していることを意味します。Enumクラスに入ることで、私たちの仮定を確認できます: そして、メソッド自体の本体は次のとおりです: ordinal ()メソッドはここでは呼び出されません。代わりに、列挙内の要素のインデックス番号である順序変数が使用されます。ordinal ()メソッド自体は、 順序変数 のゲッターにすぎません。


77. 列挙型の例を書く
上で説明した質問で、すでにenumの例を示しました。ここでコードを複製する理由はありません。たとえば、列挙型のコンストラクターに関する質問 72 を参照してください。78. Enum はスイッチケースで使用できますか?
それはできるし、そうあるべきです!私の経験を振り返ると、 enumの最も一般的な使用法の 1 つはswitchステートメントのような論理構造で使用されることに注意します。この場合、考えられるすべてのcaseを指定できます。各enumフィールドのロジックを一度記述すれば、 default句さえ必要ありません。結局のところ、Stringまたはintなどの数値を使用すると、予期しない値を受け取る可能性がありますが、 enum ではそれは不可能です。上記の例の switchステートメントは次のようになります。public void doSomething(Role role) {
switch (role) {
case STUDENT:
// some logic for STUDENT
break;
case TEACHER:
// some logic for TEACHER
break;
case DIRECTOR:
// some logic for DIRECTOR
break;
case SECURITY_GUARD:
// some logic for 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 API は、データ ストリームを操作する比較的新しい方法であり、ビッグ データをより便利かつコンパクトに処理できるほか、いくつかのストリーム間でデータを並行して処理できるため、パフォーマンスが向上する可能性があります。81. トランザクションの主なプロパティに名前を付けます
ここでのトピックは Stream API ですが、質問はトランザクションに関するものです。うーん...まず、トランザクションとは何かを理解しましょう。トランザクションは、データベースに対する一連の操作のグループです。これは作業の論理単位を表します。トランザクションは、他の同時トランザクションから独立して完全かつ正常に実行され、それによってデータの整合性が維持されます。または、まったく実行されず、その場合は効果がありません。トランザクションには 4 つの主要なプロパティがあり、頭字語ACIDのおかげで簡単に覚えることができます。この頭字語の各文字が何を意味するかを見てみましょう。 AはAtomicityを表します。このプロパティは、システム内でトランザクションが部分的にコミットされていないことを保証します。そのサブオペレーションがすべて実行されるか、どれも実行されないか ( all or nothing ) のいずれかです。 С は一貫性を表します。このプロパティは、成功した各トランザクションが有効な結果のみをコミットすることを保証します。言い換えれば、これは、トランザクションが成功した場合、特定のデータに対するシステムのルールがすべて従うことを保証するものです。トランザクションが成功しない場合、トランザクションは実行されず、システムのデータは以前の状態に戻ります。 Iは孤立の略です。このプロパティは、トランザクションの実行時に、同時トランザクションがその結果に影響を与えてはならないことを意味します。このプロパティはリソースを大量に消費するため、原則として部分的に実装され、特定の分離の問題を解決する特定のレベルの分離が可能になります。これについては次の質問で詳しく説明します。 D は耐久性の略です。このプロパティにより、ユーザーがトランザクションが完了したという確認を受け取った場合、何らかの障害によって変更がキャンセルされないことが保証されます。つまり、トランザクションが正常に終了したという確認をすでに受け取っていれば、オペレーティング システムの障害によってデータが影響を受けることはないと確信できます。82. トランザクション分離レベルとは何ですか?
前に述べたように、ACID プロパティに関して言えば、分離を確保することはリソースを大量に消費するプロセスです。したがって、このプロパティは部分的に実装されます。分離にはさまざまなレベルがあり、レベルが高くなるほど、パフォーマンスへの影響が大きくなります。トランザクション分離レベルに進む前に、トランザクション分離が不十分なために発生するさまざまな問題を考慮する必要があります。-
ファントム読み取り: 単一トランザクション内で複数回呼び出された同じリクエストが、別のトランザクションによる挿入により異なる結果を生成する場合。
-
非反復読み取り: 単一トランザクション内で複数回呼び出された同じリクエストが、別のトランザクションによる変更 (更新) や削除により異なるデータを生成する場合。
-
ダーティ読み取り: トランザクションによって追加または変更され、その後ロールバックされた、まだコミットされていないデータを読み取ります。
-
更新の損失: 1 つのデータ ブロックが異なるトランザクションによって同時に変更され、最後の変更を除くすべての変更が失われる場合 (マルチスレッドの競合状態と同様)。
分離レベル | ファントムリード | 反復不可能な読み取り | ダーティリード | アップデートが失われました |
---|---|---|---|---|
シリアル化可能 | + | + | + | + |
反復読み取り | - | + | + | + |
コミットされた読み取り | - | - | + | + |
コミットされていない読み取り | - | - | - | + |
なし | - | - | - | - |
83. Statement と PreparedStatement の違いは何ですか?
ここで突然変更が加えられ、JDBCの機能に移行しました。いずれにせよ、まずステートメントが何であるかを理解しましょう。SQL クエリを形成するために使用されるオブジェクトです。 JDBC は、Statement、PreparedStatement、およびCallableStatement の3 種類を使用します。今日はCallableStatement については考慮しません。代わりに、 StatementとPreparedStatementの違いについて話します。-
ステートメントは、ランタイム入力パラメータを使用せずに単純な SQL クエリを実行するために使用されます。PrepareStatement は実行時に入力パラメータを受け入れることができます。
-
PreparedStatementのパラメータを設定するには、入力パラメータはリクエスト内で疑問符として記述されるため、setDouble()、setFloat()、setInt()、setTime() などのさまざまなセッターを使用して値に置き換えることができます。これは、間違ったタイプのデータをリクエストに挿入しないことを意味します。
-
PreparedStatementはプリコンパイルされ、キャッシュを使用するため、 Statementオブジェクトで作成されたリクエストよりもわずかに高速に実行できます。その結果、パフォーマンスを向上させるために、頻繁に実行される SQL ステートメントはPreparedStatementオブジェクトとして作成されます。
-
Statement はSQL インジェクションに対して脆弱ですが、PreparedStatement はそれを防ぎます。
GO TO FULL VERSION