【専門家インタビュー】 Javaの基礎(36問)

記事ディレクトリ

1. 8つの基本データの分類

(1) 第 1 種類の整数型: byte、short、int、long
(2) 第 2 種類の浮動小数点型: float、double
(3) 第 3 種類の論理型: boolean
(4) 第 4 種類の文字タイプ: 文字

2. 書き換えとオーバーロードの違い

1. オーバーロード ルール:

①異なるパラメータリストが必要です。

②異なるアクセス修飾子が存在する可能性があります。

③ さまざまな例外がスローされる可能性があります。

2. メソッドをオーバーライドするためのルール:

①パラメータリストはオーバーライドされたメソッドとまったく同じである必要があります。そうでない場合、それは上書きとは言えずオーバーロードと呼ばれます。

②返される型は常にオーバーライドされたメソッドの戻り型と同じである必要があり、そうでない場合は上書きではなくオーバーロードと呼ばれます。

③アクセス修飾子の制限は、オーバーライドされたメソッドのアクセス修飾子より大きくなければなりません。

④サブクラスのオーバーライドされたメソッドがスローする例外の型が、親クラスのオーバーライドされたメソッドがスローする例外の型以下である。

3. クラス関係の違い:

オーバーライドはサブクラスと親クラス間の関係であり、垂直方向の関係であり、オーバーロードは同じクラス内のメソッド間の関係であり、水平方向の関係です。

3. int と integer の違い

  • データ型: int は Java の基本データ型、integer は int のラッパー クラスです。
  • Nullability: null を表現できない基本的なデータ型です。int 変数が明示的に初期化されていない場合、デフォルト値 0 が割り当てられます。Integer は、NULL 値を表すことができるオブジェクトです。Integer を null (値がないことを意味する) に設定できます。
  • パフォーマンス: int は基本的なデータ型であり、オブジェクト ヘッダーや追加の記憶領域を必要としないため、メモリ内で使用する領域が少なくなります。Integer はオブジェクトであるため、より多くのメモリ領域を占有し、ボックス化 (int を Integer に変換) およびボックス化解除 (Integer を int に変換) するときに追加の操作が必要となり、パフォーマンスに影響を与える可能性があります。
  • メソッドと演算: int にはメソッドやプロパティがなく、基本的な数学演算と比較演算のみを実行できます。Integer クラスには、文字列への変換、比較、解析などのさまざまな整数関連の操作を実行できる、 、 などの豊富なメソッドがequalsありComparetoますtoString

4. Java キーワード

(1) アクセス修飾子 (3)
ここに画像の説明を挿入します(2) メソッド、クラス、プロパティ、および変数の変更 (9)
ここに画像の説明を挿入します
(3) クラス、インターフェイス、抽象クラスと実装インターフェイス、継承クラスのキーワード、および 6 つのインスタンス化されたオブジェクトの定義
ここに画像の説明を挿入します
(4) ) 2パッケージのキーワード
ここに画像の説明を挿入します
(5) データ型のキーワード 12 個
ここに画像の説明を挿入します
(6) 条件付きループ (合計 12 個)
ここに画像の説明を挿入します
(7) エラー処理 5 個
ここに画像の説明を挿入します
要約:
Java には51 個のキーワード+ 2 個の予約済みキーワードがあります 合計53 個、キーワードはすべて小文字!
予約済みのキーワード:

  • 定数
  • goto
    question: しかし、質問を行う過程で、true、false、および null は Java のキーワードではありません。つまり、Java のキーワードは 50 個しかありません。
    Java の true、false、および null は、Java のキーワードや予約語ではなく、定数値を表示するだけであり、Java で識別子として使用することはできません。

5. 自動ボクシングとアンボクシングとは何ですか?

  • ボクシング: 基本型はカプセル化された型に変換され、このプロセスは明示的なコードなしで自動的に実行されます。
  • アンボックス化: カプセル化された型を基本型に変換するプロセス。、このプロセスも自動的に実行されます。
    機能: 自動ボックス化およびボックス化解除により、コードの冗長性を削減しながら、基本データ型とパック型の間の変換がより便利になります。

6. Java のポリモーフィズムとは何ですか?

平たく言えば、特定の動作を完了するためのさまざまな形式であり、異なるオブジェクトがそれを完了すると、異なる状態が生成されます。

たとえば、生徒が親クラス、運動場で体育の授業を受ける生徒、教室にいる生徒がそのサブクラスとなります。このとき、授業のベルが鳴り、体育の授業の生徒は運動場に行き、教室の生徒は教室に戻ってきましたが、生徒によって反応が異なりました。これがポリモーフィズムです。

役割: 柔軟性と保守性、コードの再利用、インターフェイスの複数の実装:

7. インターフェースと抽象クラスの違いは何ですか?

定義されたキーワードは異なります:interface、abstract class:abstract。
サブクラスの継承または実装のキーワードは異なります:interface:implement、extends。
型拡張は異なります。抽象クラスは単一の継承を持ちますが、インターフェイスは複数の継承を持ちます。
メソッド アクセス制御文字: 抽象クラスには制限はありませんが、抽象クラス内の抽象メソッドはプライベートによって変更できません。インターフェイスには制限があり、デフォルトのインターフェイス制御文字はパブリックです。
属性メソッド制御シンボル: 抽象クラスには制限はありませんが、インターフェイスには制限があり、インターフェイスのデフォルトの制御シンボルは public です。
メソッドの実装は異なります。抽象クラスの通常のメソッドは実装する必要があり、抽象メソッドは実装できませんが、インターフェイスの通常のメソッドは実装できませんが、JDK 8 の静的メソッドとデフォルトのメソッドは実装する必要があります。
静的コード ブロックの使用法は異なります。抽象クラスは静的コード ブロックを持つことができますが、インターフェイスは持つことができません。

8. Java で例外を処理するにはどうすればよいですか?

try...catch を使用する

9. Java の Final キーワードの機能は何ですか?

Final を使用して変更できる構造: クラス、メソッド、変数
Final はクラスを変更するために使用されます。このクラスは他のクラスに継承できません。
Final はメソッドを変更するために使用されます: このメソッドをオーバーライドできないことを示します。final
は変数を変更するために使用されます。この場合、変数は定数と同等です。

10. Java におけるシリアル化と逆シリアル化とは何ですか?

シリアル化は、オブジェクトの状態をバイト ストリームに変換して、ネットワーク経由で送信したり、ディスクに保存したりできるようにするプロセスです。逆シリアル化は、シリアル化されたバイト ストリームをオブジェクトに復元するプロセスです。Java では、シリアル化と逆シリアル化は ObjectInputStream と ObjectOutputStream を通じて実装されます。

なぜシリアル化が必要なのでしょうか?

最新のアプリケーションでは、多くの場合、オブジェクトの状態を異なるシステム、プロセス、スレッド間で転送する必要があります。たとえば、分散システムでは、オブジェクトを異なるサーバー間で転送する必要がある場合があります。別の例として、オブジェクトをキャッシュに保存する場合、オブジェクトをディスクに保存できるようにシリアル化する必要があります。

11. Java の String、StringBuilder、StringBuffer の違いは何ですか?

String は不変オブジェクトを宣言します。各操作により新しい String オブジェクトが生成され、ポインタは新しいオブジェクトを指します。

StringBuffer と StringBuilder は、元のオブジェクトに基づいて動作できます。
StringBuffer と StringBuiler の違いは、StringBuffer はスレッド セーフであるのに対し、StringBuilder は非スレッド セーフであることです。

StringBuilder >StringBuffer > String
ただし、StringBuiler は StringBuffer よりも効率的です。

12. Java のオブジェクト指向プログラミングの 4 つの主な特徴は何ですか?

カプセル化、継承、ポリモーフィズム、および抽象化は、オブジェクト指向プログラミングの 4 つの主要な特徴です。

13. Javaのequals()メソッドとhashCode()メソッドの機能は何ですか?

equals() メソッドは、オブジェクトの内容が等しいかどうかを比較するために使用されます。一方、 hashCode() メソッドは、コレクション クラス (HashMap など) などのデータ構造で効率的な検索および比較操作を行うためのオブジェクトのハッシュ コードを生成するために使用されます。 、ハッシュセット)。これら 2 つのメソッドは通常、一貫性を必要とします。つまり、2 つのオブジェクトが論理的に等しい場合、正しいセット操作を保証するには、それらのハッシュ コードも等しくなければなりません。

14. 文字列を反転するにはどうすればよいですか?

StringBuilder または stringBuffer の reverse() メソッドを使用します。

15. 「==」メソッドと「equal()」メソッドの違いは何ですか?

equals()は、2つのオブジェクトの値(内容)が同じかどうかを比較します。
「==」は、2 つのオブジェクトの参照 (メモリ アドレス) が同じかどうかを比較し、2 つの基本データ型の変数値が等しいかどうかを比較するためにも使用されます。

16.final、finalize、finalizeの違いは何ですか?

  1. Final は、それぞれ定数を表す変数、メソッド、クラスを宣言するために使用されます。メソッドをオーバーライドしたり、クラスを継承したりすることはできません。
  2. 最後に、例外処理ステートメント構造の一部であり、例外が発生するかどうかに関係なく常に実行されるコードのセクションを示します。
    3.finalize は Object クラスのメソッドです。ガベージ コレクターが実行されると、リサイクルされたオブジェクトの Finalize() メソッドが呼び出され、ガベージ コレクション中にファイルのクローズや接続の解放などの他のリソースのリサイクル操作が実行されます。

17. String の intern() メソッドの機能は何ですか?

文字列定数プールにこの String オブジェクトと等しい文字列が既に含まれている場合は、定数プール内の文字列の参照 (メモリ アドレス) を返します。そうでない場合は、新しい文字列を定数プールに入れて、新しい文字列の参照 (メモリ アドレス) を返します。

18. JVM、JRE、JDKとは何ですか?

JVM
JVM。これは Java Virtual Machine の略称で、Java バイトコード ファイル (*.class ファイル) を実行するために使用されます。JVM には、さまざまなオペレーティング システム (Windows、Linux、nacOC など) 用の固有の実装があります。その目的は、同じバイトコードを使用し、異なるオペレーティング システムで同じ結果を実行することです。これは、Java がクロスプラットフォームを実現するための中心的なメカニズムです。Java のデフォルトの仮想マシンは HotSpot VM ですが、このほかに JRockit (BEA)、j9 (IBM)、TaoBaoVM (淘宝網) などの仮想マシンがあり、JRE JRE は Java Runtime Environment の略です

JRE には、Java 仮想マシンと Java プログラムに必要なコア クラス ライブラリが含まれており、開発した Java プログラムを実行する場合は、JRE をコンピュータにインストールするだけで済みます。
JDK
JDKとは、Java開発者向けに提供されるJava Development Kit(Java Development Kit)の略称で、JREとアプリケーションの開発・調整・監視のためのツール、コンパイルツール(javac.exe)、パッケージ化ツール(jar.exe)が含まれています。 、Java 監視および管理プラットフォーム (jConsole、jvisualvm) など、

JDK には JRE が含まれ、JRE には JVM が含まれます。つまり、JDK > JRE > JVM になります。

19.Java言語の利点は何ですか?

1. オブジェクト指向 (カプセル化、継承、ポリモーフィズム)、
2. クロスプラットフォーム (Java 仮想マシンはプラットフォームの独立性を実現)、
3. 信頼性、
4. セキュリティ、
5. マルチスレッドのサポート、
6. ネットワーク プログラミングのサポート、
7.実行方法は解釈実行+コンパイル実行の共存を採用;
8. 実用事例が多数あります。

20.コンストラクターメソッドとは何ですか?

コンストラクターの名前はクラスの名前と一致しています。
コンストラクターには戻り値の型構造がなく、コンストラクターを void で宣言することはできません。
オブジェクトの作成時に、new キーワードを使用して実行コンストラクターを呼び出します。
クラスがコンストラクターを宣言していない場合、Java はデフォルトの引数なしの構築メソッドを提供します。

21.String クラスの一般的なメソッドは何ですか?

  1. IndexOf(): 指定された文字のインデックスを返します。
  2. charAt(): 指定されたインデックスの文字を返します。
  3. replace(): 文字列の置換。
  4. substring(): 文字列をインターセプトします。
  5. split(): 文字列を分割し、分割された文字列配列を返します。
  6. トリム(): 文字列の両端の空白を削除します。
  7. getBytes(): 文字列のバイト型配列を返します。
  8. length(): 文字列の長さを返します。
  9. toLowerCase()/toUpperCase(): 文字列を小文字/大文字に変換します。
  10. equals(): 文字列の比較。

22. hashCode() はなぜ必要ですか? (hashCode が必要な理由を説明するために、「HashSet の重複をチェックする方法」を例に挙げます)

1. HashSet にオブジェクトを追加すると、HashSet はまずオブジェクトの hashCode 値を取得して、オブジェクトが追加される位置を計算し、追加された他のオブジェクトのハッシュコード値と比較します。
2. 重複する hashCode がない場合、HashSet はオブジェクトが繰り返し出現しないものとみなし、通常どおり追加します。
3. 同じ hashCode 値を持つオブジェクトが見つかった場合、equals() メソッドを使用して、等しい hashCode を持つオブジェクトが本当に同じかどうかを確認します。
4. 2 つが同じ場合、HashSet は正常に追加されません。
5. 2 つが異なる場合は、他の場所に再ハッシュされます。
6. これにより、equals() の実行回数が大幅に減少し、それに応じて実行速度が向上します。

23 なぜ、equals() をオーバーライドするときに、hahsCode() メソッドをオーバーライドする必要があるのですか?

equals() メソッドと hashCode() メソッドの間には特定の協力関係があるため、これらは連携して、ハッシュ テーブルなどのデータ構造に配置されたときのオブジェクトの正しい動作を保証します。
ハッシュ テーブルなどのデータ構造を使用するときに一貫性とパフォーマンスを確保するために、通常、equals() メソッドをオーバーライドするときに hashCode() メソッドをオーバーライドし、それらの間の論理的な一貫性を確保することをお勧めします。そうしないと、コレクション内のオブジェクトの動作が正しくなくなり、パフォーマンスの問題が発生する可能性があります。

equals() メソッドと hashCode() メソッドの関係は一貫している必要があります。

  1. 2 つのオブジェクトが同じである場合 (つまり、equals との比較で true が返される場合)、それらの hashCode 値は同じである必要があります。
  2. 2 つのオブジェクトの hashCode が同じである場合、それらは必ずしも同じであるとは限りません (比較には等号を使用します)。

コラボレーション関係: ハッシュ テーブル (HashMap、HashSet など) では、オブジェクトの hashCode 値を使用してテーブル内のオブジェクトの格納場所が決定され、equals メソッドは 2 つのオブジェクトが等しいかどうかを確認するために使用されます。2 つのオブジェクトが等しいとみなされる場合 (つまり、equals メソッドが true を返す場合)、それらの hashCode 値は同じである必要があります。

パフォーマンス: hashCode() メソッドを正しく実装しないと、ハッシュ テーブルのパフォーマンスが影響を受ける可能性があります。ハッシュ テーブルでは、高速な検索と挿入の速度はオブジェクトの hashCode に依存します。hashCode メソッドが不適切な場合、ハッシュの競合が発生し、ハッシュ テーブルのパフォーマンスが低下する可能性があります。

一貫性: Java 仕様によれば、equals() メソッドで 2 つのオブジェクトが等しいとみなされる場合、それらの hashCode 値は同じでなければなりません。これは、ハッシュ テーブルでは、最初に hashCode 値に基づいて潜在的な一致が検索され、次に、一致の精度を保証するために、equals メソッドが使用されるためです。

要約すると、equals() メソッドをオーバーライドするすべてのクラスでは、hashCode() メソッドもオーバーライドする必要があります。そうしないと、Object.hashCode の一般的な規則に違反し、HashSet や HashTable などのコレクションが作成されます。さらに、equals() が頻繁に呼び出されるのを回避し、パフォーマンスのオーバーヘッドを軽減できます。

24.パッケージクラスにおける定数プールテクノロジーの役割は何ですか?

  1. Byte、Short、Integer、Long は [-128, 127] の範囲でキャッシュ データを作成します。
    2.Characterは[0, 127]の範囲にバッファデータを作成します。
    3. データがキャッシュ範囲内にある場合、オブジェクトを再作成する必要はなく、キャッシュから直接取得されるため、オブジェクトの繰り返し作成によって生じるメモリとパフォーマンスのオーバーヘッドが軽減されます。
    4. データがキャッシュ範囲を超える場合、新しいオブジェクトが作成されます。

25.文字列定数プールとは何ですか?

文字列定数プールにより、同じ内容の文字列が 1 回だけ保存されることが保証されます。これは、2 つの文字列が同じ文字シーケンス (同じ内容) を持っている場合、それらは同じ文字列オブジェクトを参照することを意味します。
new を使用して String オブジェクトを作成すると、それは新しいオブジェクトになります。

intern() メソッドの使用: String クラスは、文字列オブジェクトを文字列定数プールに明示的に追加するために使用できる intern() メソッドを提供します。文字列オブジェクトが定数プールに存在することを確認する必要がある場合は、このメソッドを使用できます。

String str1 = "hello"; // 创建一个字符串对象,存储在常量池中
String str2 = "hello"; // 直接引用常量池中的同一字符串对象

String str3 = new String("hello"); // 创建一个新的字符串对象,存储在堆内存中
String str4 = str3.intern(); // 使用intern()方法将字符串对象添加到常量池中

System.out.println(str1 == str2); // true,引用同一常量池对象
System.out.println(str1 == str3); // false,不同对象
System.out.println(str1 == str4); // true,引用同一常量池对象

26.Java は値渡しですか、それとも参照渡しですか?

Java では、すべてのメソッドは値渡しであり、パラメータが基本型の場合、パラメータの値がコピーされてメソッドに渡されます。パラメーターが参照型の場合、オブジェクト パラメーターの Heap ヒープ内のメモリ アドレス値をコピーし、メソッドに渡します。

27. Object クラスの一般的なメソッドは何ですか?

  • getClass メソッド: オブジェクトのランタイム クラス オブジェクトを取得します。クラス オブジェクトは、オブジェクトが属するクラスを記述するオブジェクトです。
  • hashCode メソッド: このメソッドは主にオブジェクトのハッシュ値を取得するために使用されます。Object のこのメソッドは、デフォルトでオブジェクトのヒープ メモリ アドレスを返します。
  • クローンメソッド
  • toString メソッド
  • ファイナライズメソッド
  • waitメソッド
  • 通知メソッド

28. Java の一般的なインターフェイスは何ですか?

1. コレクションフレームワーク: Collection インターフェイス、List インターフェイス、Set インターフェイス、Map インターフェイス、
2. Comparator: Comparator インターフェイス、Comparable インターフェイス、
3. IO 操作: Closeable インターフェイス (閉じることができるファイル ストリーム)、
4. Marking インターフェイス: RandomAccess インターフェイス(コレクション要素へのランダム アクセス)、シリアル化可能インターフェイス (シリアル化)、クローン可能インターフェイス (オブジェクトのクローン作成);
5. スレッド インターフェイス: 実行可能インターフェイス。

29. 例外とは何ですか?

プログラム内のエラーを総称して例外と呼びます。

30. Java の例外システムをどのように理解していますか?

  • Throwable はすべての例外クラスの親クラスです。
    • エラー メモリオーバーフロー、JVM例外など、プログラムが処理できません
    • 例外プログラムは処理できます。
    • チェック可能な例外: 最も一般的な例外は IO 例外です。try-catch ステートメントを使用してそれをキャプチャするか、throws 句を使用して宣言します。そうしないと、コンパイルは成功しません。
    • チェックできない例外:
      • ランタイム例外は try…catch を使用してキャッチされます
      • 実行時以外の例外が原因でコンパイルが失敗します。

31.エラーと例外の違いは何ですか?

  1. エラー タイプのエラーは通常、システム クラッシュ、メモリ不足、スタック オーバーフローなどの仮想マシン関連のエラーです。コンパイラはそのようなエラーを検出せず、JAVA アプリケーションはそのようなエラーをキャプチャすべきではありません。そのようなエラーが発生すると、アプリケーションは通常は終了し、アプリケーション自体では回復できません。
  2. 例外タイプの例外は、アプリケーション内でキャッチして処理できます。通常、このようなエラーが発生した場合は、アプリケーションが正常に実行を継続できるように処理する必要があります。

32.投げる と 投げる はどう違いますか?

  • throw キーワードは、メソッドまたはコード ブロックで例外オブジェクトをスローするために使用されます。チェック例外と非チェック例外の両方をメソッド内でスローして使用できます。
  • throws キーワードは、このメソッドによってスローできる例外タイプのリストを識別するために使用されます。メソッドが定義されるとき、パラメータ リストの後、メソッド本体の前に定義されます。

33.Java の一般的な例外は何ですか?

  1. NullPointerException Null ポインター例外: この例外は、インスタンス化されていない null 参照を呼び出すことによって発生します。
  2. ClassNotFoundException クラスが見つからない例外: この例外は、クラスの完全修飾名に従って、存在しないクラスをロードするとき (リフレクション中など) にスローされます。
  3. NumberFormatException 数値書式設定の例外: 文字列を数値に変換するとき、文字列に数値以外のコンテンツが含まれている場合、この例外がスローされます。
  4. IndexOutOfBoundsException インデックス範囲外例外: この例外は、配列または文字列インデックスが範囲を超えるとスローされます。
  5. IllegalArgumentException 不正なパラメータ例外: 受信パラメータが不正であるため、この例外がスローされます。
  6. ClassCastException 型変換例外: 互換性のないクラス型を変換し、この例外をスローします。
  7. SQLException SQL 例外: この例外は、データベースの操作中に SQL 構文エラーが発生した場合にスローされます。
  8. IOException 読み取りおよび書き込み例外: この例外は、ファイル ストリームに対する IO 読み取りおよび書き込み操作中にエラーが発生した場合にスローされます。
  9. NoSuchMethodException メソッドに例外はありません。呼び出し元のメソッドが見つからないため、この例外がスローされます。

34. メモリの可視性についてのあなたの理解について教えてください。

たとえば、パブリック変数 a があり、3 つのスレッドがあり、1 つのスレッドが a の値を変更し、他の 2 つのスレッドは a の変更された値を認識できない可能性があります。これはメモリの可視性の問題です。
その理由は次のとおりです。処理速度を向上させるために、各スレッドは CPU 内に共有変数のローカル キャッシュを維持し、共有変数に対するスレッドのすべての操作は独自のローカル キャッシュで実行されます。スレッド A が共有変数を変更すると、スレッド B にはスレッド A の変更が表示されない場合があります

  • volatile キーワードを使用します。
    変数を volatile として宣言します。これにより、すべてのスレッドが最新の値を参照するように Java 仮想マシンに指示されます。
    スレッドが揮発性変数の値を変更すると、その変更はすぐにメイン メモリに書き込まれ、他のスレッドは変数を読み取るときにメイン メモリから最新の値を取得します。

  • synchronized キーワードを使用する:
    synchronized ブロックを使用して読み取り操作と書き込み操作を同期し、同時に 1 つのスレッドだけが共有変数にアクセスできるようにします。
    スレッドがロックを取得して共有変数を変更すると、他のスレッドは変数にアクセスする前にスレッドがロックを解放するのを待つ必要があるため、可視性が確保されます。

  • java.util.concurrent パッケージのツール クラスを使用する:
    Java には、AtomicInteger、CountDownLatch、CyclicBarrier などのいくつかの同時実行ツール クラスが用意されており、これらを使用すると、同期コードを手動で記述せずにマルチスレッドの可視性の問題を処理できます。
    これらのユーティリティ クラスは、共有変数への変更が他のスレッドに確実に表示されるようにするためのアトミックな操作と同期メカニズムを提供します。

35. volatile キーワードについてのあなたの理解を教えてください。

volatile は、変数を変更するために使用される Java のキーワードです。その主な役割は、マルチスレッド環境での可視性と順序付けを確保することです。つまり、1 つのスレッドが volatile 変数の値を変更すると、他のスレッドはその変更を即座に確認できるようになります。
volatile キーワードの役割:

  • 可視性: マルチスレッド環境では、1 つのスレッドが volatile 変数の値を変更すると、この変更は他のスレッドにも表示されます。これは、1 つのスレッドが揮発性変数を変更すると、他のスレッドは期限切れのキャッシュされた値を読み取ることはできませんが、最新の値を確認できることを意味します。
  • 命令の並べ替えを無効にする (順序付け): volatile キーワードを使用すると、コンパイラとプロセッサが命令を並べ替えることもできなくなります。これにより、予期しない命令の並べ替えが発生することなく、揮発性変数への読み取りと書き込みがコードの順序で実行されることが保証されます。
  • アトミック性は保証されません: volatile キーワードは可視性と順序付けのみを保証しますが、アトミック性は保証しません。複数のスレッドが同じ揮発性変数に同時に書き込むと、競合状態が発生する可能性があります。アトミック操作が必要なシナリオの場合は、java.util.concurrent の同期クラスまたはアトミック クラスを使用する必要があります。

適用可能なシナリオ: volatile は、スレッド間のシグナル通知など、一部の単純なフラグ ビットまたはステータスの識別操作に適しています。累積演算などの複雑な演算には適していません。

36. Java 8 の新機能は何ですか?

(1) インターフェイスのデフォルト メソッドと静的メソッド: 以前は、インターフェイスは実装なしでメソッドを宣言することしかできませんでしたが、Java 8 以降、インターフェイスはデフォルトの実装を持つことが許可され、デフォルトの修飾子でマークする必要があります。

default void test(){
    
    }
static void test2(){
    
    }
  • 効果:
    • 既存のインターフェイスへの新しいメソッドの追加: デフォルト メソッドを使用すると、既にインターフェイスを実装しているクラスを壊すことなく、既存のインターフェイスに新しいメソッドを追加できます。Java 8 より前は、インターフェイスに新しいメソッドを追加する場合、そのインターフェイスを実装するすべてのクラスがそのメソッドの実装を提供する必要があり、これにより既存のコードが破損する可能性がありました。
    • インターフェイスの拡張性: デフォルトの方法では、インターフェイスの拡張性が向上します。既存の実装クラスを壊すことなく、新しいメソッドをインターフェイスに追加できます。これは、既存のコードに影響を与えることなくインターフェイスを徐々に進化させることができるため、インターフェイス指向のプログラミングに役立ちます。
    • ラムダ式と関数型プログラミング: デフォルト メソッドとラムダ式の導入により、関数型プログラミングでのインターフェイスの使用が容易になります。たとえば、Java 標準ライブラリの java.util.function パッケージの関数インターフェイスはデフォルト メソッドを使用するため、Lambda 式を使用するときに 1 つまたは少数の抽象メソッドのみを実装できます。

(2) ラムダ式: Lambda について最も直感的な点は、コードが整理されることです。

     

(3) 機能インターフェイス:

  • コンパレータ
  • 消費者
  • 述語 (アサーティブインターフェイス)
  • サプライヤー
  • 関数 (関数インターフェース)

(4) メソッド参照: コードを読みやすくするために、クラスまたはインスタンス内のメソッドまたはコンストラクターに直接アクセスするために使用されます。
これを使用して::クラス内のメソッドを呼び出すだけです。

在这里插入代码片

(5) ストリーム: データ収集を宣言的な方法で処理できます。

  • 特徴:
    • 内部反復:
    • ストリームの走査は 1 回のみです。ストリームの走査が完了すると、ストリームは消費されます。
    • 並列処理が可能:select.stream().parallel()

(6) オプション: NULL ポインター例外を解決します。また、これを使用すると、明示的に null ポインタ検出を実行する必要がなくなり、コードがより簡潔になります。
オプションの + ラムダは、文字列を比較し、最長の文字列を見つけることを実装します。

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class OptionalLambdaExample {
    
    

    public static void main(String[] args) {
    
    
        List<String> stringList = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");

        Optional<String> longestString = stringList.stream()
                .reduce((s1, s2) -> s1.length() > s2.length() ? s1 : s2);

        longestString.ifPresent(s -> System.out.println("最长的字符串是: " + s));
    }
}

(7) 日付/時刻
(8) 重複したアノテーション
(9) 拡張アノテーションのサポート
(10) Base64
(11) JavaFx

おすすめ

転載: blog.csdn.net/qq_42785250/article/details/132942929