Java の基礎を学ぶ際に、JDK 1.5 から 1.9 までの新機能を簡単に比較できるようにまとめました。各バージョンはニーズに応じて選択できます。 Apache php mysql
jdk1.5 の新機能:
1. ジェネリックス JDK1.8 の新機能:
ArrayList list=new ArrayList()------>ArrayList
2 自動ボックス化/アンボックス化
nt i=list.get(0).parseInt();-------->int i=list.get(0); 元の型と対応 ラッパークラス明示的な変換は必要ありません
3 for-each
i=0;i
4 static import
Math.sqrt();--------------->sqrt();
5 可変長パラメータ
int sum(int ...intlist) があります任意の数のパラメータを配列として扱います
jdk1.6 の新機能:
1. for ループ ステートメントの強化
Integer[]numbers = computeNumbers();
for (int i=0; i < ;数値.length ; i++)
sum +=数値[i];
||
int sum = 0;
for ( int number: computeNumbers() )
sum +=数値;
2. Java SE 6メモリ リークの分析および診断機能が強化されています。 java.lang.OutOfMemory 例外が発生した場合、完全なスタック情報を取得でき、ヒープがいっぱいになると、この致命的なエラーを記録するログ ファイルが生成されます。さらに、JVM には、ヒープがいっぱいのときにスクリプトを実行できるオプションが追加されました。
3. プラグイン注釈処理
プラグイン注釈処理 API (JSR 269) は、注釈を処理するための一連の標準 API を提供します
4. セキュリティ
jdk1.7 の新機能:1. Java7 モジュール分割方式により、一部の不要なモジュールがダウンロードされずにインストールされるため、仮想マシンの起動速度も大幅に向上します。 2. 多言語サポート
Java7 の仮想マシンは、Ruby、Python などのさまざまな動的プログラミング言語のサポートを追加します。
3. 開発者の開発効率が向上
スイッチで文字列を使用可能
マルチスレッドの同時実行と制御の観点: 軽量の分離とマージのフレームワーク、同時アクセスをサポートする HashMap など
注釈によるプログラムの静的チェックが強化されました。
ファイル システム アクセス、非同期入出力操作、ソケット チャネルの構成とバインディング、マルチポイント データ パケット送信などのためのいくつかの新しい API を提供します。
4. 実行効率の向上
オブジェクト ポインタを 64 ビットから一致する 32 ビット ポインタに圧縮するテクノロジーにより、メモリとメモリ ブロックの消費が大幅に削減され、実行効率が向上します。
ガベージコレクションの負荷を軽減し、ガベージコレクションの効果を高めるための新しいガベージコレクション機構(G1)を提供します。
1. インターフェースのデフォルトメソッド
Java 8 では、default キーワードを使用して非抽象メソッド実装をインターフェースに追加できます。この機能は拡張メソッドとも呼ばれます。
2. ラムダ式
Java 8 では、この従来の匿名オブジェクト メソッドを使用する必要がなくなり、より簡潔な構文であるラムダ式が提供されます。 {
return b.compareTo(a);
});
3. 関数インターフェイス
Java 型システムではラムダ式はどのように表現されますか?各ラムダ式は型 (通常はインターフェイス型) に対応します。 「関数型インターフェイス」とは、1 つの抽象メソッドのみを含むインターフェイスを指します。この型のすべてのラムダ式は、この抽象メソッドに一致します。デフォルト メソッドは抽象メソッドとはみなされないため、関数インターフェイスにデフォルト メソッドを追加することもできます。
4. メソッドとコンストラクターの参照
Java 8 では、:: キーワードを使用してメソッドまたはコンストラクターの参照を渡すことができます。
converter = something :: のように、静的メソッドを参照する方法も示しています。 startsWith;
String Converted = Converter.convert("Java");
System.out.println(converted);
5. Lambda スコープ
ラムダ式内の外部スコープと古いバージョンの匿名オブジェクトにアクセスする メソッドは非常に似ています。 Final とマークされた外部ローカル変数、またはインスタンス フィールドや静的変数に直接アクセスできます。
6. ローカル変数へのアクセス
ラムダ式で外部ローカル変数に直接アクセスできます:
7. オブジェクト フィールドと静的変数へのアクセス
ローカル変数とは異なり、ラムダは内部でインスタンス フィールドと静的変数にアクセスできます。この動作は匿名オブジェクトと一致しています:
8. インターフェイスにアクセスするデフォルトの方法
JDK 1.8 API には、古い Java で一般的に使用される Comparator インターフェイスや Runnable インターフェイスなどの多くの組み込み関数インターフェイスが含まれており、これらのインターフェイスには @ FunctionalInterface アノテーションが追加されています。ラムダ上で使用できます。
Java 8 API は、作業をより便利にするための多くの新しい関数インターフェースも提供します。一部のインターフェースは Google Guava ライブラリーからのものです。これらのインターフェースに慣れている場合でも、これらがどのようにラムダで使用されるのかを確認する必要があります。 JDK1.9の新機能
java 7は2011年にリリースされ、Java 8は2014年にリリースされ、java9は2017年9月21日にリリースされました。 Java 9 のモジュール システムについて聞いたことがあるかもしれませんが、この新しいバージョンには他にも多くの更新があります。 ここでは、Java 9 に搭載される 9 つのエキサイティングな新機能を紹介します。
1. Java プラットフォーム レベルのモジュール システム
Java 9 の特徴的な機能は、まったく新しいモジュール システムです。コード ベースが大きくなるにつれて、複雑で入り組んだ「スパゲッティ コード」が作成される可能性が飛躍的に増加します。現時点では、2 つの基本的な問題に直面する必要があります。それは、コードを真にカプセル化することが難しいこと、もう 1 つは、システムが異なる部分 (つまり、JAR ファイル) 間の依存関係について明確な概念を持っていないことです。すべてのパブリック クラスは、クラスパス上の他のパブリック クラスからアクセスできるため、パブリックにアクセスすることを意図していない API が誤って使用される可能性があります。さらに、クラスパス自体にも問題があります。必要な JAR がすべてすでに存在しているかどうか、または重複したエントリがあるかどうかをどのようにして知ることができるのでしょうか? モジュール システムは両方の問題を解決します。 モジュラー JAR ファイルには、追加のモジュール記述子が含まれています。このモジュール記述子では、他のモジュールへの依存関係が「requires」によって表現されます。さらに、「exports」ステートメントは、他のモジュールがどのパッケージにアクセスできるかを制御します。エクスポートされないパッケージはすべて、デフォルトでモジュールにカプセル化されます。以下は、「module-info.java」ファイルに存在するモジュール記述子の例です: module
blog {
exports
com.pluralsight.blog;
requires
cms;
}
当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 Java 9 中的新的 jlink 工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。
许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。
测试一个 Java 正则表达式是一个很好的说明 jshell 如何使您的生活更轻松的例子。 交互式 shell 还可以提供良好的教学环境以及提高生产力,您可以在此了解更多信息。在教人们如何编写 Java 的过程中,不再需要解释 “public static void main(String [] args)” 这句废话。
有时一些小事情可以带来很大的不同。你是否就像我一样在一直使用 Google 来查找正确的 Javadoc 页面呢? 这不再需要了。Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。此外,你会注意到,每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。
通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:
Set<Integer> ints = Set.of( 1 , 2 , 3 ); List<String> strings = List.of( "first" , "second" );
除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。
长期以来,Stream API 都是 Java 标准库最好的改进之一。通过这套 API 可以在集合上建立用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:
IntStream.iterate( 1 , i -> i < 100 , i -> i + 1 ).forEach(System.out::println);
第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。
除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(可能是空的) Stream 对象:
Stream<Integer> s = Optional.of( 1 ).stream();
在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 非常有用。
Java 8 为我们带来了接口的默认方法。 接口现在也可以包含行为,而不仅仅是方法签名。 但是,如果在接口上有几个默认方法,代码几乎相同,会发生什么情况? 通常,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法会成为公共API的一部分。 使用 Java 9,您可以向接口添加私有辅助方法来解决此问题:
public interface MyInterface { void normalInterfaceMethod(); default void interfaceMethodWithDefault() { init(); } default void anotherDefaultMethod() { init(); } // This method is not part of the public API exposed by MyInterface private void init() { System.out.println( "Initializing" ); } }
Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你可以在 Java 9 中开始使用这套 API:
HttpClient client = HttpClient.newHttpClient(); HttpRequest req = HttpRequest.newBuilder(URI.create( "http://www.google.com" )) .header( "User-Agent" , "Java" ) .GET() .build(); HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
HttpResponse
除了这个简单的请求/响应模型之外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,比如流和服务端推送。
我们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:
multirelease.jar ├── META-INF │ └── versions │ └── 9 │ └── multirelease │ └── Helper. class ├── multirelease ├── Helper. class └── Main. class
在上述场景中, multirelease.jar 可以在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,可以运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,因为较老版本的 Java 只会看到顶层的这个 Helper 类。
end:写的有点长,内容也比较多,可能也掺杂很多废话,希望多多谅解哈,大家多多鼓励,我会持续更新更多优质的文章,分享使我快乐!
相关文章:
相关视频:
以上がJDK バージョン 1.5 から 1.9 までの新機能を比較しやすく体系的に説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。