Java の開発や学習を行う上で、JDK、JRE、Java VMなどの言葉を耳にすることがあるでしょう。
また、Java は歴史が長く、1995年にUNIXベンダーとして有名でだったサン・マイクロシステムズによって公開されたプログラミグ言語で、これまでに、多くの機能追加や廃止が行われてきました。
この記事では、Java の開発で必要とされるJDK、JRE、Java VM の違いや、Java のバージョンごとに追加された機能を解説します。
JVM、JDK、JREの違い
まず、JDK、JRE、JVM が、どういった物なのかを見ていきましょう。
JVM
JVM は Java Virtual Machine の略で、コンパイルされた class ファイル等を読み込んで、Java アプリケーションを実行する環境です。
Java では、一度コンパイルされたファイルは、Windows や Mac OS、Linux を問わず、マルチプラットフォームで動作可能であるという特徴があります。
JVMは、OS 環境ごとの違いを吸収するクッション的な役割を持ち、複数の環境で Java を実行する役割を担っています。
JRE
JRE は Java Runtime Environment の略で、Java のプログラムを動かすためのランタイム環境です。
JRE には Java プログラムを実行するための APIセットが含まれており、ソースコードをコンパイルするための開発環境は含まれません。
JDK
JDK は Java Development Kit の略で、Java の開発を行うためのツールやコンパイラや、実行環境などが含まれています。
Java でアプリケーション開発をする場合はは、このJDK を使用します。
Javaのバージョンを確認する
現在インストールされている Java のバージョンを確認する方法を解説します。
セキュリティのリスクを回避し、安全に Java アプリを運用するために、最新のバージョンか、長期サポートが効いている LTS 版の使用が推奨されています。
GUI で Java のバージョンを確認する場合は、Windowsの「スタート」メニューから Javaコントロール・パネルを起動して確認できます。
コマンドで確認する場合は、Windows であればコマンドプロンプト、Linux や mac の場合はターミナルを起動し、次のコマンドを入力します。
java -version
もし、複数の Java のバージョンがインストールされている環境の場合、java.exe へのバスが通っている環境のバージョンが表示されます。
Java 新機能の歴史
Java は、1995年に登場して以降、多くのバージョンアップを繰り返し、新機能が追加されてきました。
ここからは、Java バージョンごとに、追加されてきた機能を Java 1.5 から振り返ってみましょう。
Java 1.5
Java 1.5 の代表的な新機能には次の3つがあります。
- 総称型(Generics)
- 列挙型(Enum)
- 可変長引数
1つ目の総称型(Generics)は、これまでの Java の型に関する問題を解決する新機能となりました。
Java 1.4までは ArrayList などのコレクションの要素の型は Object 型となり、リストから値を取り出す時に毎回キャストする必要性があることや、要素にどのような型のオブジェクトでも追加できてしまうことから、想定外の不具合を発生させる危険性がありました。
総称型(Generics)の登場によって、次のコードのように、リストに入る要素の方を限定させることができ、冗長なキャストを行うコードや、型安全なコードを書くことができるようになりました。
//String型の値しか入らないリストを作成
List<String> list = new ArrayList<String>();
Enum は、複数の定数を一つのクラスとしてまとめるための機能です。Java 1.4までは関連する定数もすべて個別の変数として定義していましたが、Java 1.5 からは次のように1つの列挙型として定義できるようになりました。
enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
【関連記事】
▶Javaのコレクション「List」「Set」「Map」を使いこなそう
Java 1.6
ArrayDeque、Deque(双方向キュー)などのクラスが追加され、キューに関する機能への改善が行われました。
また、ファイルの拡張子で検索するための FileNameExtensionFilter クラスの追加など、細かい改善が行われています。
【関連記事】
▶Javaのキューとスタックのデータ構造をサンプルコードを見ながら理解する
Java 1.7
Java 1.7 の代表的な新機能には、次の3つがあります。
- 文字列でも switch 分岐が可能に
- ダイアモンド演算子(<>)
- リソース付きtry文(try-with-resources)
1つ目は、これまでの switch 構文では、式に指定できるのは int、char などのプリミティブ形だけでしが、文字ラ
列(String)も式に指定可能になりました。
String lang;
switch (lang) {
case "Python":
typeOfDay = "Start of work week";
break;
case "c":
case "c++":
typeOfDay = "Midweek";
break;
case "Java":
typeOfDay = "End of work week";
break;
default:
throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
}
2つ目のダイアモンド演算子は、総称型(Generics)のクラスをインスタンス化する際に、型引数が変数の宣言などから推測できる場合、型引数を省略できるようになりました。
//Java1.5での書き方
List<String> list = new ArrayList<String>();
//Java1.7からは次のように書ける
List<String> list = new ArrayList<>();
Java 1.8
Java 1.8では画期的な変更点として、Stream API やラムダ式が新たな機能として追加されました。
Stream API はコレクションに対し、特定の条件でデータを抽出したり、コレクションの各要素を別の方に変換したり、合計値などを求める集合操作など、コレクションに対する操作を for 構文などの繰り返しを使わない形で簡潔に記述できる API です。
また、ラムダ式の登場により、関数型インタフェースを簡素化された記述でき、これを Stream API と組み合わせることで、よりシンプルな記述ができるようになっています。
【関連記事】
▶Java Stream API (ストリームAPI)を使ってみよう
Java 1.9
Java 1.9では、モジュールシステムが新たに追加されました。
モジュールは、Java のパッケージやリソースをモジュールという単位にまとめて、モジュールが、他のモジュールをどのように使うか、どのパッケージを他のモジュールから見えるようにするのかを制御する仕組みです。
【関連記事】
▶Java9の新機能と目玉機能のモジュールシステムを理解しよう
その他にも、Optionalクラスの拡張、Stream APIの機能強化、並行処理のアップデート、
並列処理の改善(スピン・ウェイト・ヒント)など、多くの新しい機能や、既存機能の強化が行われています。
まとめ
Javaの JRE、JDK、JVMの違いや、Java のバージョンごとの新機能について解説してきました。
今後のバージョンアップにも、ぜひ注目しましょう。
現在は、JRE単体でのダウンロードは行えず、後述する JDK と合わせてダウンロードします。