JavaRush /Java Blog /Random-JA /Java開発者へのインタビューからの質問と回答の分析。パート8
Константин
レベル 36

Java開発者へのインタビューからの質問と回答の分析。パート8

Random-JA グループに公開済み
実践か理論か?もっと重要なことは何ですか?もちろん練習の方が大切だという人も多いでしょう。できるだけ一生懸命練習すれば幸せになれます。私はこれにあえて反対します。 Java開発者へのインタビューからの質問と回答の分析。 パート8-1面接では、あなたの練習の上手さは誰も知りません。理論に基づいて正確に全文質問されます。そして、すべての面接を通過してプロジェクトに参加したときにのみ、実践的なスキルを発揮することになります。あなたは反対するかもしれません。時にはテスト課題が与えられることもありますが、それでも練習が必要です。私は反論しません。面接は時々行われることもありますが、実際のところ、理論的な面接は時々行われることもありますが、常に行われます。違いを感じますか?したがって、足元には強固な理論的基盤が必要であり、私たちは今日もそれを強化し続けます。つまり、面接でよく聞かれる質問を分析していきます。

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

次の列挙型があるとします。
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
生徒に対してtoString()を呼び出して、コンソールに生徒を表示してみましょう。
System.out.println(Role.STUDENT.toString());
コンソールに表示される結果は次のとおりです。
学生
つまり、デフォルトでは、enumtoString() は定数自体の名前になります。

72. Enum内にコンストラクタを指定することは可能ですか?

はい、確かに。内部 enum 変数の値はコンストラクターを通じて設定されます。例として、各役割の年齢範囲を示すために、 前の列挙型に 2 つのフィールド ( ageFromageTo )を追加してみましょう。
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()メソッドを持ちません。オブジェクトを参照する変数の比較について話す場合、== は参照の値 (同じオブジェクトを参照しているかどうか) のみを比較します。また、あるオブジェクトが別のオブジェクトと同一であっても、これは別のオブジェクトであるため、==による比較では負の結果 ( false ) が得られます。ご存知のとおり、equals()メソッドは参照変数を比較するために使用されます。これはObjectクラスの標準メソッドの 1 つで、オブジェクトの完全な比較に必要です。ただし、すぐに明確にする価値があります。このメソッドが正しく機能するには、このクラスのオブジェクトをどのように比較するかを正確に記述して再定義する必要があります。メソッドをオーバーライドしない限り、デフォルトでは==によってオブジェクトを比較します。IntelliJ IDEAでは、(IDEA ツールを使用して) これを自動的にオーバーライドできます -> alt + insert、表示されるウィンドウで、equals() と hashCode()を選択します-> どのクラス フィールドが参加するかを選択します -> 自動的に実装されますメソッドが完成しました。以下は、 2 つのフィールド ( int ageString 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 を使用する場合、機能も正しく計算されます。特に、enumequalsメソッドの本体に入ると、 Enumクラスでのメソッドの実装が次のようになっていることがわかります。内部 - 参考による古き良き比較! 要約すると、enumの場合、==等しいの両方による比較は正しいです。Java開発者へのインタビューからの質問と回答の分析。 パート8-2Java開発者へのインタビューからの質問と回答の分析。 パート8-3Java開発者へのインタビューからの質問と回答の分析。 パート 8 - 4

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

enum要素でint ordinal()メソッドを呼び出すと、一般的な列挙型のこの値の 0 からの序数が取得されます。前述の列挙型の 1 つの要素( Role)でこのメソッドを使用してみましょう。
System.out.println(Role.DIRECTOR.ordinal());
したがって、コンソールには次のように表示されます。
2

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);
そして、コンソールには次のように表示されます。
学生教師ディレクター SECURITY_GUARD
アルファベット順ではない出力を受け取りました。重要なのは、TreeSet値のenum要素、またはTreeMapのキーとしてenum 要素を使用すると、要素は自然な順序 ( enumで指定された順序) で並べ替えられるということです。これらの機能を理解することは、より良いコードを書くのに役立ちます。Java開発者へのインタビューからの質問と回答の分析。 パート 8 - 5

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

前に述べたように、ordinal() は一般的な列挙リスト内の値の序数を返します。また、前の質問の分析では、たとえばTreeSet (並べ替えられたセット) 内の列挙型の要素は、 enumで宣言された順序を取ることが分かりました。ご存知のとおり、TreeSetTreeMap はComparableインターフェイスのCompareTo()メソッドを呼び出して要素を並べ替えます。このことから、 EnumクラスがComparableインターフェイスを実装し、 compareTo()メソッドに実装し、その中でordinal()を使用して並べ替え順序を設定していると想定できます。Enumクラスに入ると、次の確認が表示されます。そして、メソッド自体の本体: ordinal()メソッドはここでは呼び出されません。代わりに、序数変数、つまり列挙内の要素の序数が使用されます。ordinal()メソッド自体は、順序変数のゲッターにすぎません。Java開発者へのインタビューからの質問と回答の分析。 パート 8 - 6Java開発者へのインタビューからの質問と回答の分析。 パート 8 ~ 7Java開発者へのインタビューからの質問と回答の分析。 パート8 - 8

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

ストリームAPI

80.Javaのストリームとは何ですか?

Java Stream は、データ ストリームを操作する比較的新しい方法です。これにより、大規模なデータをより便利かつコンパクトに処理できるほか、特定の数のスレッド間でデータ処理を並列化できるため、使用時のパフォーマンスが向上します。機能性。このトピックを一言でこれ以上深く説明することはできません。そのため、このトピックを詳しく理解するのに役立つ記事へのリンクをここに残しておきます。Java開発者へのインタビューからの質問と回答の分析。 パート 8 ~ 9

81. トランザクションの主な特性は何ですか?

このトピックは Stream API と呼ばれていますが、質問はトランザクションに関するものです。うーん...まず、トランザクションとは何かを理解しましょう。 トランザクションは、データを操作する論理単位を表す一連の一連のデータベース操作です。トランザクションは、データの整合性を維持し、並行して実行されている他のトランザクションから独立して完全に正常に完了することも、まったく完了できない場合は効果がありません。したがって、トランザクションには 4 つの主要なプロパティがあり、これらは略してACIDと呼ばれます。この略語の各文字がどのように表されるかを見てみましょう。 A - 原子性 - 原子性- このプロパティは、トランザクションがシステムに部分的に記録されないことを保証します。そのサブ操作がすべて実行されるか、何も実行されません ( all or nothing )。 C - 一貫性 - 一貫性は、成功した各トランザクションが有効な結果のみを記録することを保証するプロパティです。つまり、これは、トランザクションが成功した場合、システムが特定のデータに課すすべてのルールと制限が満たされることを保証します。満たさない場合、トランザクションは完了せず、システム内のデータは以前の状態に戻ります。州。 I - 分離 - 分離は、トランザクションの実行中に並列トランザクションがその結果に影響を与えてはならないというプロパティです。この特性はリソースを大量に消費するため、通常は、特定の断熱問題を解決する特定のレベルの断熱を許可することによって部分的に実装されます。これについては次の質問で詳しく説明します。Java開発者へのインタビューからの質問と回答の分析。 パート 8 ~ 10D - 耐久性 -このプロパティにより、ユーザーは、トランザクションが完了したというシステムからの確認を受け取った場合、何らかの障害によって加えた変更がキャンセルされないことを保証できます。つまり、トランザクションが正常に完了したという確認をすでに受け取っていれば、オペレーティング システムに何らかの障害が発生してもデータには何も影響しないと確信できます。

82. トランザクション分離レベルとは何ですか?

前に述べたように、ACID 分離の提供はリソースを大量に消費するプロセスです。したがって、この特性は部分的に満たされます。分離にはさまざまなレベルがあり、レベルが高いほど生産性への影響が大きくなります。トランザクション分離レベルに進む前に、トランザクション分離が不十分であることによるさまざまな問題を検討する必要があります。
  • ファントム読み取り- 同じサンプル (同じクエリ) が同じトランザクション内で繰り返し呼び出される場合、受信したデータが異なります。これは、別のトランザクションによるデータ挿入が原因で発生します。

  • 非反復読み取り- 同じサンプル (同じクエリ) が同じトランザクション内で繰り返し呼び出される場合、受信したデータは異なります。これは、別のトランザクションによるデータの変更 (更新) や削除が原因で発生します。

  • ダーティ読み取り- その後確認されない (ロールバックされる) トランザクションによって追加または変更されたデータを読み取るプロセス。無効なデータの読み取り。

  • 更新の喪失- 異なるトランザクションが同じデータを同時に変更すると、最後の変更を除くすべての変更が失われます (マルチスレッド環境における「競合状態」問題を思い出させます)。

トランザクション分離レベルは、どの分離問題から保護するかによって特徴付けられます。断熱レベルとそれがどのような問題から保護するかを表の形式で検討してみましょう。
分離レベル ファントムリーディング 繰り返しのない読書 汚い読書 アップデートが失われました
シリアル化可能 + + + +
反復読み取り - + + +
コミットされた読み取り - - + +
コミットされていない読み取り - - - +
なし - - - -
そして、コインの裏側を忘れないでください。分離レベルが高くなるほど、トランザクションの処理にかかる時間が長くなります (複数のトランザクションが並行して実行される場合)。このトピックについてさらに詳しく知りたい場合は、始めるのに最適な記事をここに記載しています。

83. Statement と PreparedStatement の違いは何ですか?

そして、ここではJDBCテクノロジの機能への移行があまりスムーズではありません。そこで、まずStatement が実際に何であるかを理解しましょう。これは、SQL クエリを生成するために使用されるオブジェクトです。JDBC は、StatementPreparedStatementCallableStatement3 つのタイプを使用します。 今日はCallableStatementについては説明しません。 StatementPreparedStatementの違いについて話しましょう。
  1. ステートメントは、動的に挿入される受信パラメータを使用せずに単純な SQL クエリを実行するために使用されます。PrepareStatement は、入力パラメータを動的に挿入する機能とともに使用されます。

  2. PreparedStatementでパラメータを設定するには、リクエスト内の入力パラメータを疑問符として記述し、 setDouble()、 setFloat() 、 setInt() 、setTime ( )などのさまざまなセッターを使用して値の代わりに値を挿入します。 .. その結果、間違ったタイプのデータをクエリに挿入することがなくなります。

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

  4. Statementは SQL インジェクションに対して脆弱ですが、PreparedStatement はSQLインジェクションを防ぎます。SQL インジェクションの排除と Java セキュリティにおけるその他のベスト プラクティスについて詳しくは、この記事をご覧ください。

Java アプリケーションをデータベースに接続するテクノロジ (JDBC) を学び始めている場合は、この記事から始めることをお勧めします。さて、今日はこの辺でやめておきます。Java開発者へのインタビューからの質問と回答の分析。 パート 8 ~ 11
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION