CodeGym/Java Blog/ランダム/Java 開発者の職の面接での質問と回答を調査します。パート8
John Squirrels
レベル 41
San Francisco

Java 開発者の職の面接での質問と回答を調査します。パート8

ランダム グループに公開済み
人のメンバー
実践か理論か?もっと重要なことは何ですか?多くの人は当然、練習の方が重要だと言うでしょう。日が沈むまで練習すれば幸せになれる、みたいな。私はこれにあえて反対します。 Java 開発者の職の面接での質問と回答を調査します。 パート8-1面接では、練習中のあなたのかっこよさなんて誰にもわかりません。代わりに、理論の切り口をデモンストレーションするように求められます。実践的なスキルを発揮するのは、あらゆる階層の面接を乗り越えてプロジェクトに割り当てられるまで後になります。「時々テスト課題が出されるから、練習は必要だ」と反対する人もいるかもしれません。私もその意見に異論はありませんが、私が言いたいのは、これは場合によってはあるが、面接では常に理論の知識を実証する必要があるということです。違いを感じますか?これはすべて、足元に強固な理論的基盤を持たなければならないことを意味しており、それが今日私たちが構築し続けることです。具体的には、面接でよく聞かれる質問について見ていきます。

71. Enum の toString() メソッドをオーバーライドしないとどうなりますか?

次の列挙型があるとします。
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
toString()メソッドを呼び出して、コンソールにSTUDENTフィールド を表示してみましょう。
System.out.println(Role.STUDENT.toString());
その結果、次のコンソール出力が得られます。
学生
したがって、 enumの場合、 toString()のデフォルト実装は定数自体の名前を返すこと がわかります。

72. Enum 内でコンストラクターを宣言できますか?

はい、もちろん。コンストラクターは、 enumの内部フィールドの値を設定するものです。例として、各役割の年齢範囲を示すために、 前の列挙型( ageFromageTo ) に 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 つです。まず、単純な値 ( intchardouble ...) を比較する場合、これらの変数には直接比較できる具体的な値が含まれるため、==を使用します。さらに、プリミティブ変数は本格的なオブジェクトではなく、Objectクラスを継承せず、 equals()メソッドを持ちません。オブジェクトを参照する変数の比較について話している場合、== は参照の値、つまり参照が同じオブジェクトを参照しているかどうかのみを比較することを知っておく必要があります。1 つのオブジェクト内のすべてのデータが別のオブジェクト内のすべてのデータと同一である場合でも、これらは別のオブジェクトであるため、比較に==を使用すると負の結果 ( false ) が返されます。ご想像のとおり、参照変数を比較するには、 equals()メソッドを使用します。これはObjectクラスの標準メソッドの 1 つであり、オブジェクトの本格的な比較に必要です。ただし、このメソッドが正しく機能するためには、オブジェクトを比較する方法を正確に示すためにメソッドをオーバーライドする必要があることをすぐに言っておきます。メソッドをオーバーライドしない場合は、== を使用してオブジェクトを比較するデフォルトの実装が取得されます。IntelliJ IDEA では、IDEA ショートカットAlt+Insertを使用して自動的にオーバーライドできます。表示されるウィンドウで、「equals()」「hashCode()」を選択します。次に、関係するフィールドを選択します。出来上がり!メソッドは自動的に実装されます。以下は、自動生成された等しいメソッドが、2 つのフィールド ( int ageString 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()の間に実質的な違いはありません。 Java 開発者の職の面接での質問と回答を調査します。 パート8-2結局のところ、enumには定数が格納され、 ==を使用して同一の値を比較した場合でも、比較される参照は常に同じオブジェクトを指すため、trueが得られます。また、 equals()を使用すると、正しい結果も得られます。Enumの等しいメソッドの本体に進むと、 Enumクラスに次の実装がある ことがわかります。内部には古き良き参照の比較が表示されます。要約すると、enumについては、 ==quals()の両方を使用して正しく比較できます。 Java 開発者の職の面接での質問と回答を調査します。 パート8-3Java 開発者の職の面接での質問と回答を調査します。 パート 8 - 4

74. Enum の ordinal() メソッドは何をしますか?

enumフィールドでint ordinal()メソッドを呼び出すと、enum 値のリスト内のフィールドの 0 から始まるインデックスが取得されます。以前に検討した、 Role列挙型のフィールドでこのメソッドを呼び出してみましょう。
System.out.println(Role.DIRECTOR.ordinal());
したがって、コンソールには次のように表示されます。
2

75. Enum は Java の TreeSet または TreeMap で使用できますか?

TreeSetTreeMapでは列挙型を使用できます。そして、次のように書くことができます:
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);
そして、コンソールには次のように表示されます。
学生教師ディレクター SECURITY_GUARD
出力は得られましたが、アルファベット順ではありませんでした。重要なのは、enumフィールドをTreeSet値またはTreeMapキーとして使用する場合、フィールドは自然な順序 ( enum で指定された順序)でソートされるということです。これがどのように機能するかを理解することは、より良いコードを書くのに役立ちます。

76. Enum の ordinal() メソッドと CompareTo() メソッドはどのように関連していますか?

前述したように、ordinal() はenum フィールドのリスト内のフィールドのインデックスを返します。また、前の質問の考察で、 enum フィールドが TreeSet (ソートされたセット) に配置されると、 enumで宣言された順序が適用されることが分かりました。ご存知のとおり、TreeSetTreeMap はComparableインターフェイスのCompareTo()メソッドを呼び出すことで項目を並べ替えます。これは、EnumクラスがComparableインターフェイスを実装していること、つまり、内部でordinal()メソッドを使用して並べ替え順序を決定するCompareTo()メソッドを実装していることを意味します。Enumクラスに入ることで、私たちの仮定を確認できます: そして、メソッド自体の本体は次のとおりです: ordinal ()メソッドはここでは呼び出されません。代わりに、列挙内の要素のインデックス番号である順序変数が使用されます。ordinal ()メソッド自体は、 順序変数 のゲッターにすぎません。 Java 開発者の職の面接での質問と回答を調査します。 パート 8 - 5Java 開発者の職の面接での質問と回答を調査します。 パート 8 - 6Java 開発者の職の面接での質問と回答を調査します。 パート 8 ~ 7

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);
}
コンソールには次のように表示されます。
学生教師ディレクター SECURITY_GUARD

ストリーム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 は、StatementPreparedStatement、およびCallableStatement の3 種類を使用します。今日はCallableStatement については考慮しません。代わりに、 StatementPreparedStatementの違いについて話します。
  1. ステートメントは、ランタイム入力パラメータを使用せずに単純な SQL クエリを実行するために使用されます。PrepareStatement は実行時に入力パラメータを受け入れることができます。

  2. PreparedStatementのパラメータを設定するには、入力パラメータはリクエスト内で疑問符として記述されるため、setDouble()setFloat()setInt()setTime() などのさまざまなセッターを使用して値に置き換えることができます。これは、間違ったタイプのデータをリクエストに挿入しないことを意味します。

  3. PreparedStatementはプリコンパイルされ、キャッシュを使用するため、 Statementオブジェクトで作成されたリクエストよりもわずかに高速に実行できます。その結果、パフォーマンスを向上させるために、頻繁に実行される SQL ステートメントはPreparedStatementオブジェクトとして作成されます。

  4. Statement はSQL インジェクションに対して脆弱ですが、PreparedStatement はそれを防ぎます。

それでは、これで終わりにします。
コメント
  • 人気
  • 新規
  • 古い
コメントを残すには、サインインしている必要があります
このページにはまだコメントがありません