ホームページ >Java >&#&ベース >jdk1.7とjdk1.8の違いは何ですか

jdk1.7とjdk1.8の違いは何ですか

青灯夜游
青灯夜游オリジナル
2020-12-14 17:17:5113631ブラウズ

相違点: 永続的な世代は jdk1.8 でキャンセルされ、メタスペースに置き換えられました。このスペースは、jvm 仮想マシンのメモリを占有するのではなく、物理マシンのメモリを占有します。jdk8 では、ラムダ式とローカル アクセスが追加されています。 . 変数、関数インターフェイス、その他の機能。

jdk1.7とjdk1.8の違いは何ですか

jdk1.7 と jdk1.8 の比較

1. jdk1 .7 構文

1) バイナリを使用して、0b から始まる整数を表すことができます。

2) switch ステートメントは文字列型をサポートします

3) try ブロックは、finally を使用せずに手動で閉じることができます。try ブロック内で直接閉じることができます

4) 複数のキャッチ例外の説明: Catch 例外タイプは最終的なものであるため、変更できません。この機能により、生成されるバイトコードが減り、コードの冗長性が減ります。例外を再スローするときは、例外のタイプを保持します。

5) 数字にアンダースコアを使用すると、よりわかりやすくなります。ただし、下線を付けるときのルールに注意してください。下線は数字の間にのみ使用できます。数字の先頭や末尾には下線を使用しないでください。

6) ジェネリック インスタンスを作成する場合、インスタンスのジェネリック型は、変数が宣言されたときのジェネリック型に基づいて自動的に推論されます。

7) コンパイルの警告とエラーを改善するために、可変パラメーター メソッドで具体化されていないパラメーターを渡します。

8) より有益なバックトレース。

2. NIO2 のいくつかの新機能

1) 非同期ノンブロッキング IO と Proactor の実装

2) ファイル ツリーとファイルを再帰的に検索します拡張機能 Search

3. Jdbc

1) try-with-resources を使用して、Connection、ResultSet、および Statement リソース オブジェクトを自動的に閉じることができます。

2) RowSet1.1 (インターフェイス モデル): RowSetFactory インターフェイスと RowSetProvider クラスを導入すると、JDBC ドライバーでサポートされるさまざまな行セットを作成できます。ここでの行セット実装は、実際に SQL ステートメントの一部の操作をメソッドに変換します。この操作はいくつかの関数をカプセル化します。

3) jdk8ではJDBC-ODBCドライバーが削除されます。

4. 同時実行ツールの強化

1) フォークジョイン、Fork/Join フレームワークは、Java7 によって提供されるタスクの並列実行のためのフレームワークです。大きなタスクをいくつかの小さなタスクに分割し、最後に各小さなタスクの結果を要約して、大きなタスクの結果の枠組みを取得します。 (マルチコア機能を最大限に活用して、大きな問題をサブ問題に分解します。複数の CPU で複数のサブ問題を同時に解決し、最終的に結果をマージできます。)

2) ThreadLocalRandon 同時乱数生成クラスは、同時乱数生成のスレッドの安全性を保証します。実際には、threadlocal が使用されます。

3) フェイザー クラス

java5 には同時実行パッケージがあります。セマフォ(セマフォ)、CountDownLatch(ロック)、CyclicBarrier(フェンス)があります。 Phaser クラスは CountDownLatch と CyclicBarrier を最適化します。

セマフォ: セマフォは複数のロックを宣言できます (1 つのロックを含む: これは相互排他的なセマフォです)。

例: 部屋に 5 人しか収容できない場合、追加の人はドアの外で待つ必要があります。どうやってするの?解決策の 1 つは、部屋の外に 5 つの鍵を吊るし、入ってきた人は 1 つの鍵を持ち去り、鍵のない人は部屋に入ることができず、外で待つことです。誰かが出てくるたびに、鍵を元の場所に戻し、他の人が再び入りやすくします。

は主に、アクセスできるスレッドの最大数を制御するために使用されます。デフォルトは不公平です。ロックの公平性は、コンストラクターを通じて明示的に宣言できます。

ラッチ:

意味: CountDownLatch は、初期化中に初期値を設定するカウンターとして理解できます。最初の操作 完了したら、await() メソッドを呼び出す必要があります。このメソッドは、待機中のすべてのスレッドが実行を完了するまでスレッドをスリープ状態にします。 countDown() メソッドが呼び出されるたびに、内部カウンターは 1 ずつデクリメントされ、カウンターが 0 に達してウェイクアップするまで続きます。これは特別な CyclicBarrier として理解できます。スレッド同期ポイントは特別で、内部カウンター値が 0 に達したときに開始されます。

メソッド: 2 つのコア メソッド: countDown() と await()。 countDown(): CountDownLatch によって維持される内部カウンターを 1 ずつ減分し、待機中の各スレッドが完了したときに呼び出します。

await(): スレッドが CountDownLatch を実行すると、スレッドはスリープ状態になります。

例: 会議の例: 会議は、すべての参加者が揃った場合にのみ会議室で開始できます。到着した。

フェンス:

意味: フェンスにより、2 つ以上のスレッドが特定のランデブー ポイントで同期できるようになります。スレッドがランデブー ポイントに到達すると、await() メソッドを呼び出して他のスレッドを待ちます。スレッドが await() メソッドを呼び出した後、CyclicBarrier はスレッドをブロックし、スリープ状態にして他のスレッドの到着を待ちます。最後のスレッドが await() メソッドを呼び出すと、CyclicBarrier は待機中のすべてのスレッドを起動し、これらのスレッドは実行を継続します。 CyclicBarrier は、別の Runnable オブジェクトを初期化パラメータとして渡すことができます。すべてのスレッドがランデブー ポイントに到着すると、CyclicBarrier クラスは Runnable オブジェクトをスレッドとして実行します。

メソッド: await(): 最後のスレッドが到着するまでスレッドをスリープ状態にし、スリープ状態のすべてのスレッドを起動します。

CountDownLatch との違い:

すべてのスレッドがランデブー ポイントに到着した後、後続の実行として Runnable 型オブジェクトを受け入れます

CountDown() メソッドを明示的に呼び出しません

CountDownLatch は通常 1 回のみ使用でき、CyclicBarrier は複数回使用できます

アプリケーション シナリオ: 複数のスレッドがタスクを実行し、同期のためのランデブー ポイントに到達した後、タスクは要約のために後続のスレッドに渡されます。

フェイザー:

意味: より複雑で強力な同期補助クラス。複数ステージのタスクを同時に実行できます。同時タスクがあり、それらを複数のステップに分割して実行する必要がある場合 (CyclicBarrier は 2 つのステップに分割されています)、Phaser の使用を選択できます。 Phaser クラスのメカニズムは、各ステップの終了時にスレッドを同期し、すべてのスレッドがこのステップを完了すると、次のステップの実行が許可されます。他の同期ツールと同様に、Phaser クラスの同期操作に参加するタスクの数は初期化する必要がありますが、タスクの数が動的に増減できる点が異なります。

関数:deliveryAndAwaitAdvance(): CyclicBarrier の await() メソッドと同様に、他のスレッドの到着を待機し、同期的に実行を継続します。 deliveryAndDeregister(): ここで実行されたスレッドを Phaser からログアウトします。 isTerminated(): Phaser が終了したかどうかを判断します。 register(): 新しい参加者を Phaser に登録します。この新しい参加者は、このフェーズが完了していないスレッドとみなされます。 forceTermination(): Phaser を強制的に終了状態にします。

例: Phaser クラスを使用して、3 つの同時タスクを同期します。これら 3 つのタスクは、3 つの異なるフォルダーとそのサブフォルダーで、過去 24 時間以内に変更された .log 拡張子を持つファイルを検索します。このタスクは、ファイルの検索、ファイルのフィルター、結果の印刷の 3 つのステップに分かれています。ファイルを検索し、ファイルをフィルタリングした後、結果を分析し、結果が空の場合は、このスレッドを Phaser からログオフします。つまり、次の段階では、スレッドは実行に参加しません。 run() メソッドでは、ファイルの検索を開始する前にすべてのスレッドが開始されていることを確認するために、最初にフェイザーのdeliveryAndAwaitAdvance() メソッドが呼び出されます。ファイル検索フェーズとファイル フィルター フェーズの両方の後に、結果が処理されます。つまり、結果が空の場合はスレッドを削除し、結果が空でない場合は、このステージのすべてのスレッドがステップを完了するまで待ってから、次のステップを均一に実行します。最後に、タスクの実行後、Phaser のすべてのスレッドがログアウトされます。

フェイザーには実際には、アクティブ状態と終了状態の 2 つの状態があります。フェーザーは、同期に参加しているスレッドが存在する場合にアクティブになります。そして各ステージの終わりに同期されます。同期に参加しているすべてのスレッドが登録解除されている場合、フェーズは終了状態になります。この状態では、Phaser にはタスク参加者がいません。

Phaser の主な機能は、マルチステージ タスクを実行し、各ステージ ポイントでスレッドの同期を確保することです。参加者は、各ステージのポイントで条件付きまたは削除することもできます。これには主に、arrivedAndAwaitAdvance() メソッド、register() メソッド、arriviveAndDeregister() メソッドが含まれます。

4) ネットワークの強化

新しい URLClassLoader close メソッドはリソースを時間内に閉じることができ、その後のクラス ファイルの再ロードによってリソースが占有されたり、問題が解放されなくなったりすることはありません。

5) マルチスレッドカスタム クラス ローダー

クラスの同時読み込みによって発生する可能性のあるデッドロックの問題を解決します。これは jdk1.6 のいくつかの新しいバージョンで解決され、jdk7 ではいくつかの最適化も行われています。 。

Java1.8

1. インターフェイスのデフォルト メソッド

Java1.8 より前は、インターフェイス内のすべてのメソッドは抽象メソッドである必要がありました。 Java 8 では、default キーワードを使用するだけで、非抽象メソッド実装をインターフェイスに追加できます。

2. ラムダ式

これにより、関数に動作を渡すことができます。 Java 8 より前は、動作を関数に渡したい場合、唯一の選択肢は匿名クラスであり、それには 6 行のコードが必要でした。動作を定義する最も重要なコード行は中央に埋もれていて、十分に目立ちません。ラムダ式は匿名クラスを置き換え、テンプレートを排除し、関数型スタイルでコードを記述できるようにします。これにより、読みやすさが向上し、表現が明確になる場合があります。

3. 関数型インターフェース

インターフェースが一意の抽象メソッドを定義している場合、このインターフェースは関数型インターフェースになります。関数型インターフェイスの非常に貴重な特性は、ラムダを使用してインスタンス化できることです。

4. メソッドとコンストラクターの参照

キーワードを使用してメソッドまたはコンストラクターの参照を渡します。

5. ラムダ スコープ

ラムダ式で外側のスコープにアクセスする方法は、古いバージョンの匿名オブジェクトの方法と非常によく似ています。 Final とマークされた外部ローカル変数、またはインスタンス フィールドや静的変数に直接アクセスできます。

6. ローカル変数へのアクセス

ラムダ式で外部ローカル変数に直接アクセスできます。

7. オブジェクト フィールドと静的変数へのアクセス

ローカル変数との違いは、インスタンスのフィールドと静的変数が両方ともラムダ内で読み取りおよび書き込み可能であることです。この動作は匿名オブジェクトと一致します。

8. アクセスインターフェイスのデフォルトの方法

JDK1.8 API には、古い Java でよく使用される Comparator インターフェイスや Runnable インターフェイスなど、多くの組み込み関数インターフェイスが含まれており、これらのインターフェイスにはラムダで使用できるようにアノテーションが追加されています。

Java 8API は、作業をより便利にするための新しい関数インターフェイスも多数提供しています。一部のインターフェイスは Google Guava ライブラリからのものです。これらのインターフェイスに精通している場合でも、これらを確認する必要があります。それをラムダに拡張します。

さらに関連記事を読みたい場合は、PHP 中国語 Web サイト にアクセスしてください。 !

以上がjdk1.7とjdk1.8の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。