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

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

Random-JA グループに公開済み
こんにちは、友人!開発者になるまでどれくらい時間がかかりますか? 色々な人に質問して、色々な答えを聞きました。1か月でも十分な人もいますが、1年でも十分でない人もいます。しかし、最初の能力に関係なく、Java 開発者になるのは険しく長い道のりであることは確かです。結局のところ、重要なのは能力ではなく、頑固さと努力です。 Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 1したがって、今日も私たちは Java 開発者にとって最も人気のある面接の質問を意図的に分析し続けます。それらを学ぶことで、あなたは徐々にあなたの大切な目標に近づいていきます。始めましょう!

17. Optional の使用の成功例と失敗例を挙げてください。

ストリームを通過する特定の一連の値があり、最終的に結果として いくつかのOptionalを取得するとします。
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
予想どおり、このOptionalから値を取得する必要があります。get()だけを使用するのは悪い方法です。
String result = stringOptional.get();
しかし、このメソッドはOptional から値を取得してそれを返すことになっていますか? もちろんこれは真実ですが、それが意味がある場合です。ストリーム内の値が異なっていて、最終的に空のOptionalを受け取った場合、 get()メソッドを使用してそこから値を取得しようとすると、次のメッセージがスローされます Java開発者へのインタビューからの質問と回答の分析。 パート16-2。この場合、次の構造を使用することをお勧めします。
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    この場合、要素がOptionalにあるかどうかを確認しています。そうでない場合、結果の文字列には古い値が含まれます。

  2. String result = stringOptional.orElse("default value");

    この場合、空のOptionalの場合に結果の文字列に与えられるデフォルト値を指定します。

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    この場合、 Optionalが emptyの場合、私たち自身が例外をスローします。

これは、アプリケーションで、たとえば、オプションの値を返すSpring JPA メソッドfindById()が使用される場合に便利です。この場合、このメソッドで値を取得しようとしますが、値が存在しない場合は、ランタイム例外をスローします。この例外は、 ExceptionHandlerを使用してコントローラ レベルで処理され、ステータス404 - NOT FOUNDのHTTP応答に変換されます。 Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 3

18. main メソッドを Final メソッドとして宣言することはできますか?

はい、もちろん、main()メソッドをFinalとして宣言することを妨げるものはありません。コンパイラはエラーを生成しません。ただし、 finalとして宣言した後のメソッドはオーバーライドされず、最後のメソッドになることを覚えておく価値があります。しかし、誰がメインを再定義するのでしょうか? Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 4

19. 同じパッケージ/クラスを 2 回インポートすることはできますか? どのような結果が生じる可能性がありますか?

はい、できます。結果?Intelijj IDEA が灰色で表示する不要なインポートがいくつかあります。未使用。 Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 5Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 6

20. キャスティングとは何ですか? ClassCastException はいつ発生するのでしょうか?

キャスト (型キャスト)は、あるデータ型を別のデータ型に手動 (暗黙的キャスト) または自動 (明示的型キャスト) で変換するプロセスです。 Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 7自動変換はコンパイラによって実行され、手動変換は開発者によって実行されます。プリミティブとクラスの型キャストは多少異なるため、別々に検討します。 プリミティブ型プリミティブ型の自動キャスト の例:
int value = 17;
double convertedValue = value;
ご覧のとおり、ここでは=記号以外の追加の操作は必要ありません。プリミティブ型の手動キャストの例:
double value = 17.89;
int convertedValue = (int)value;
この場合、 (int) を使用して実装された手動キャストが観察できます。これにより、カンマの後の部分が破棄され、convertedValueの値は - 17 になります。プリミティブ型のキャストについて詳しくは、この記事をご覧ください。さて、オブジェクトの話に移りましょう。 参照型 参照型 の場合、子孫クラスから親クラスへの自動キャストが可能です。これはポリモーフィズムとも呼ばれます。Catクラスを継承するLionクラスがあるとします。この場合、自動変換は次のようになります。
Cat cat = new Lion();
ただし、明示的なキャストの場合は、プリミティブの場合のように余分なものをカットする機能がないため、すべてが多少複雑になります。そして、フォームの明示的な変換を行うだけです。
Lion lion= (Lion)new Cat();
エラーが表示されます。 Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 8実際、オブジェクトの型がLionになるため、もともとCatクラスになかったメソッドをLion子孫クラスに追加し、それらを呼び出そうとすることができます。まあ、これにはロジックはありません。したがって、型の絞り込みは、元のオブジェクトがLion型で、後で親クラスにキャストされた場合にのみ可能です。
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
また、信頼性を高めるために、 instanceOfコンストラクト を使用してオブジェクトの絞り込みキャストを行うことをお勧めします。
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
参照型キャストの詳細については、この記事を参照してください。

21. 最新のフレームワークは主に未チェック例外のみを使用するのはなぜですか?

これはすべて、チェック例外の処理が依然としてどこでも繰り返されるスパゲッティ コードであるにもかかわらず、実際にはすべての場合に必要なわけではないためだと思います。 Java開発者へのインタビューからの質問と回答の分析。 パート 16 - 9このような場合、フレームワーク内で処理を行う方が、開発者の負担が再び重くなるのを避けることができます。もちろん、緊急事態が発生する可能性はありますが、これらの同じ未チェック例外は、 try-catchでの処理を気にしたり、さらにメソッドを介したりせずに、より便利な方法で処理できます。ExceptionHandlerで例外を HTTP 応答に変換するだけ で十分です。

22. 静的インポートとは何ですか?

静的データ (メソッド、変数) を使用する場合、オブジェクト自体を作成することはできず、クラスの名前で作成しますが、この場合でもクラスへの参照が必要です。これはすべてが簡単です。通常のインポートを使用して追加されます。しかし、クラス名を記述せずに、現在のクラスの静的メソッドであるかのように静的メソッドを使用するとどうなるでしょうか? 静的インポートを使用するとこれが可能になります。この場合、静的インポートとそのメソッドへのリンクを記述する必要があります。たとえば、コサイン値を計算するための Mathクラスの静的メソッドは次のようになります。
import static java.lang.Math.cos;
その結果、クラス名を指定せずにメソッドを使用できます。
double result = cos(60);
静的インポートを使用して、クラスのすべての静的メソッドを一度にロードすることもできます。
import static java.lang.Math.*;
Java開発者へのインタビューからの質問と回答の分析。 パート 16 ~ 10

23. hashCode() メソッドと equals() メソッドの間にはどのような関係がありますか?

Oracleによると、ルールは次のとおりです。2 つのオブジェクトが等しい (つまり、equals()メソッドがtrueを返す) 場合、それらのハッシュ コードは同じでなければなりません。 同時に、2 つの異なるオブジェクトが同じハッシュ コードを持つ可能性があることを忘れないでください。equals()hashCode()が常にペアでオーバーライドされる理由を理解するには、次のケースを考慮してください。
  1. どちらのメソッドもオーバーライドされます。

    この場合、同じ内部状態を持つ 2 つの異なるオブジェクトは、equals() - trueを返しますが、hashCode()は両方とも同じ数値を返します。

    ルールが守られているので、すべてが大丈夫であることがわかります。

  2. どちらのメソッドもオーバーライドされません。

    この場合、比較は==演算子を介した参照によるものであるため、同じ内部状態を持つ 2 つの異なるオブジェクトは、 equals()のときにfalseを返します。

    hashCode()メソッドは、メモリ位置アドレスの変換された値を生成するため、(おそらく) 異なる値も返します。ただし、同じオブジェクトの場合、この値は同じになります。この場合、equals() は参照が同じオブジェクトを指している場合にのみtrueを返します。

    この場合、すべてが正常であり、ルールが満たされていることがわかります。

  3. hashCode()ではなく、equals()をオーバーライドしました。

    この場合、同じ内部状態を持つ 2 つの異なるオブジェクトの場合、equals() はtrueを返し、hashCode()は (おそらく) 異なる値を返します。

    これはルール違反ですので、お勧めできません。

  4. equals()はオーバーライドされませんが、hashCode()はオーバーライドされます。

    この場合、同じ内部状態を持つ 2 つの異なるオブジェクトに対して、equals() はfalseを返し、hashCode()は同じ値を返します。

    ルール違反があるので、アプローチが間違っています。

ご覧のとおり、ルールは、equals()hashCode() の両方がオーバーライドされるか、両方がまったくオーバーライドされない場合にのみ実行できます。 この記事で、equals()hashCode()Java開発者へのインタビューからの質問と回答の分析。 パート 16 ~ 11について詳しく読んでください。

24. BufferedInputStream クラスと BufferedOutputStream クラスはいつ使用されますか?

InputStream は、リソースからデータをバイト単位で読み取るために使用され、OutputStream はデータをバイト単位で書き込むために使用されます。ただし、バイト単位の操作は非常に不便であり、(テキストを通常どおり読み書きするために) 追加の処理が必要になる場合があります。実際には、このようなバイト レコードを簡素化するためにBufferedOutputStreamが導入され、読み取り用にBufferedInputStream が導入されました。これらのクラスはデータを蓄積するバッファにすぎず、バイトごとではなくデータ パケット (配列) 全体でデータを操作できるようになります。BufferedInputStream が作成されると、そのコンストラクターにInputStream型のインスタンスが取り込まれ、そこからデータが読み取られます。
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in は、コンソールからデータを読み取るInputStreamオブジェクトです。つまり、このBufferedInputStreamオブジェクトを使用すると、渡された配列にデータを書き込むことで、InputStreamからデータを読み取ることができます。これは、 InputStreamクラスの一種のラッパーであることがわかります。この例のarr 配列は、BufferedInputStreamからデータを受け取る配列です。次に、デフォルトで 2048 バイトのサイズを持つ別の配列を使用して、InputStreamからデータを読み取ります。同じことがBufferedOutputStreamにも当てはまります。 OutputStream型のインスタンスは、配列全体のデータを書き込むコンストラクターに渡す必要があります。
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out は、コンソールにデータを書き込むOutputStreamオブジェクトです。lush()メソッドは、BufferedOutputStreamからOutputStreamにデータを送信し、プロセス内のBufferedOutputStreamをフラッシュします。この方法がないと何も記録されません。前の例と同様に、arrはデータがBufferedOutputStreamに書き込まれる配列です。そこから、それらは別の配列のOutputStreamに書き込まれます。デフォルトのサイズは 512 バイトです。これら 2 つのクラスの詳細については、記事を参照してください。

25. java.util.Collection クラスと java.util.Collections クラスの違いは何ですか?

コレクションは、コレクション階層の先頭にあるインターフェイスです。オブジェクトのグループ全体を作成、格納、および変更できるクラスが導入されています。このために、add()remove()contains()などの多くのメソッドが提供されています。Collectionクラスの主なインターフェイス:
  • Set は、順序付けされていない一意の (反復しない) 要素を含むセットを記述するインターフェイスです。

  • List は、順序付けられたオブジェクトのシーケンスを格納するデータ構造を記述するインターフェイスです。これらのオブジェクトは独自のインデックス (番号) を受け取り、それを使用してオブジェクトを操作できます (取得、削除、変更、上書き)。

  • Queueは、 FIFO 先入れ先出しルールに従ったキューの形式で要素を格納するデータ構造を記述するインターフェイスです。

Java開発者へのインタビューからの質問と回答の分析。 パート 16 ~ 12コレクションの詳細については、こちらをご覧ください。 Collections は、さまざまなユーティリティ メソッドを提供するユーティリティ クラスです。例えば:
  • addAll(Collection<? super T> collection, T...element) -渡されたT型の要素をcollectionに追加します。

  • copy(List<? super T> dest, List<? extends T> src) - リストsrcのすべての要素をdestのリストにコピーします。

  • emptyList() - 空のリストを返します。

  • max(Collection<? extends T> collection, Comparator<? super T> comp) - 指定されたコンパレータで指定された順序に従って、指定されたコレクションの最大要素を返します。

  • unmodifiableList(List<? extends T> list) - 渡されたリストの変更不可能な表現を返します。

そして、 Collectionsにはこのように様々な便利なメソッドがたくさんあります。 これらのメソッドの完全なリストは、 Oracle Web サイトでJava開発者へのインタビューからの質問と回答の分析。 パート 16 ~ 13参照できます。快適だと私が言ったのも当然です。結局のところ、それらはすべて静的です。つまり、必要なメソッドを呼び出すために、このクラスのオブジェクトを毎回作成する必要はありません。クラスの名前を入力し、そのクラス上で目的のメソッドを呼び出し、必要な引数をすべて渡すだけです。要約すると、Collection はコレクション フレームワークのルート インターフェイスです。Collections は、コレクション構造の型に属するオブジェクトをより便利に処理するためのヘルパー クラスです。さて、今日はここまでです。ではごきげんよう!Java開発者へのインタビューからの質問と回答の分析。 パート 16 ~ 14
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION