仕事でjavaのバージョンについて知る必要がありせっかくなので自分用にまとめてみました。
皆さんも仕事で使うことがあるかもしれないので是非ご活用ください。
ネットで拾ったものを集めたものなので一部違うかもしれませんがご容赦ください。
※java25についてはLTE版なので記載したいところでしたがこちらは別記事でまとめたいと思いますm(_ _)m
Java 1.0(1996年)— すべての始まり
「Write Once, Run Anywhere」を掲げてSunが公開。JVMによるプラットフォーム非依存という概念を実現し、Webアプレットとともに一世を風靡した。
主な追加機能
- 基本クラスライブラリ ―
java.lang・java.io・java.utilなど、Javaプログラムの根幹を成すクラス群。String・Math・Systemなども含まれ、どんなJavaプログラムでも必ず使う土台となっている - AWT(Abstract Window Toolkit)― Javaで最初に提供されたGUIツールキット。OSのネイティブコンポーネントを使ってボタン・ウィンドウ・テキストボックスなどを描画する。OSに依存するため見た目がプラットフォームごとに異なる問題があり、後継のSwingに主役を譲った
- アプレット ― WebブラウザのHTML内に埋め込んで動かす小さなJavaプログラム。当時はブラウザ上でアニメーションやゲームを実現する手段として注目されたが、セキュリティリスクとFlash・HTML5の台頭により廃れ、Java 9で非推奨・Java 17で削除された
- マルチスレッド ― 1つのプログラムの中で複数の処理を同時並行で実行する仕組み。Javaは
Threadクラスとsynchronizedキーワードを言語レベルで最初から備えており、他言語との差別化ポイントの一つだった
Java 1.1(1997年)— 基盤の拡充
内部クラスやJDBCが追加され、実用的なアプリケーション開発の基盤が整った。RMIによる分散処理も可能に。
主な追加機能
- 内部クラス ― クラスの中に別のクラスを定義できる仕組み。外側のクラスのフィールドやメソッドに直接アクセスできる。ラムダ式が登場する以前は匿名内部クラスとしてGUIのイベントハンドラなどに多用されていた
- JDBC(Java Database Connectivity)― JavaからSQLデータベースに接続・操作するための標準API。MySQLやPostgreSQLなど異なるDBでも同じコードで操作できる。現在も現役で、SpringのJdbcTemplateやJPAの土台にもなっている
- RMI ― 別のJVM(別サーバーや別プロセス)にあるオブジェクトのメソッドを、まるでローカルにあるかのように呼び出せる仕組み。現代のRPCやgRPCの先祖にあたる概念だが、設定の複雑さとセキュリティリスクから現在はほぼ使われない
- JavaBeans ― 再利用可能なコンポーネントを作るための規約。「フィールドはprivateにしてgetter/setterを用意する」「引数なしのコンストラクタを持つ」などのルールに従ったクラスのこと。SpringのDIコンテナがBeanを管理する仕組みなど、現代のJavaフレームワークの設計思想の土台になっている
- リフレクション(Reflection)― 実行中にクラスの構造(メソッド・フィールドなど)を調べたり、動的にメソッドを呼び出したりできる仕組み。SpringなどのDIフレームワークが内部で多用しており、現代のJavaエコシステムを支える重要な基盤技術
🟡 非推奨
java.io.DataInputStream.readLine()― 文字エンコーディングを正しく扱えないため非推奨に(BufferedReader.readLine()を推奨)java.lang.Threadのstop()・suspend()・resume()― デッドロックを引き起こす危険があるため非推奨に
Java 1.2(1998年)— “Java 2” の登場
Collections Framework と Swing の導入が大きな転機。GUIとデータ構造の両面で現代的な土台が作られた。
主な追加機能
- Collections Framework ― リスト・マップ・セットなどのデータ構造を統一的に扱うクラス群。
ArrayList・HashMap・HashSetなどがここで整備され、共通インターフェースにより以前よりコードの再利用性が大幅に向上した - Swing ― AWTの後継となるGUIツールキット。ボタン・テキストボックス・テーブルなど豊富なUIコンポーネントをJava純粋実装で提供し、OS依存の見た目を排除した。現在はJavaFXに主役を譲っている
- JITコンパイラ(Just-In-Time Compiler)― 実行時にバイトコードをネイティブコード(機械語)へ変換することで実行速度を高める仕組み。「Javaは遅い」という当時のイメージを覆す転換点となり、現在のHotSpot JVMにも引き継がれている
- strictfp ― 浮動小数点演算の結果をどのプラットフォームでも同一にするキーワード。Java 17以降はすべての演算がデフォルトでstrictfp動作になったため実質的に意味を失い、将来削除予定
🟡 非推奨
Dateクラスの多くのメソッド(getYear()・getMonth()など)―Calendarクラスへの移行を推奨
Java 1.3(2000年)— パフォーマンス改善
HotSpot JVMが標準搭載され、実行速度が大幅に向上。JavaがエンタープライズでもWindowsのライバルになり始めた時期。
主な追加機能
- HotSpot JVM ― よく実行されるコード箇所を重点的に最適化する「ホットスポット検出」を持つJVM実装。この時点で標準JVMとして採用され、現在も使われているJVMの直接の祖先
- JNDI(Java Naming and Directory Interface)― ネットワーク上のリソース(DB接続・設定情報など)を名前で検索・取得するための統一API。LDAPやDNSなど複数のディレクトリサービスを同じコードで扱える。2021年のLog4Shell脆弱性の原因として広く知られることになった
- JavaSound ― Javaで音声の再生・録音・MIDIを扱うための標準API。それ以前はサードパーティライブラリが必要だったが、標準ライブラリだけで音声処理が書けるようになった
- Timer API ― 指定した時間後や一定間隔で処理を実行するスケジューリングの仕組み(
java.util.Timer)。現在はより高機能なScheduledExecutorServiceが推奨されている
Java 1.4(2002年)— 実用性の底上げ
正規表現やNIOなどの実用的な機能が一気に追加。assert も導入され、開発品質を高める手段が増えた。
主な追加機能
- assert ― 「この時点でこの条件は必ず真のはず」という前提をコードに書いておける仕組み。条件が偽のとき
AssertionErrorを投げる。デバッグ時の動作確認に使うもので、本番実行時はデフォルトで無効 - 正規表現 ― 文字列のパターンマッチング・検索・置換を行うための記法。
java.util.regexパッケージが追加され、メールアドレスの検証や特定パターンの抽出などを簡潔に書けるようになった - NIO(ノンブロッキングI/O)― 処理の完了を待たずに他の処理を続けられるI/O方式。大量のコネクションを少ないスレッドで捌けるため、高負荷なネットワークサーバーの実装に向いている
- XML処理 ― XMLの読み書きを標準ライブラリで行えるようになった。DOM・SAXという2つのパーサーが提供され、設定ファイルやデータ交換フォーマットとしてXMLが全盛だった当時の需要に応えた
- 例外チェーン ― 例外を別の例外でラップして投げ直す際に元の例外を保持できる仕組み。
new RuntimeException("エラー", cause)のように書くと、スタックトレースで原因の連鎖をたどれるようになりデバッグが格段に楽になった
🟡 非推奨
Thread.destroy()― 実装されておらず常に例外を投げるため非推奨に
Java 5(2004年)— 現代的Javaの基礎が整う
ジェネリクス・アノテーション・enumなど、現在のJavaコードに当たり前のように使われている機能が一気に導入された。言語仕様としての大きな転換点。
主な追加機能
- ジェネリクス ― コレクションなどに「どの型を扱うか」をあらかじめ指定できる仕組み。
List<String>のように書くと、String以外を入れようとしたときにコンパイルエラーになる。それ以前は取り出すたびにキャストが必要で実行時エラーが起きやすかった - アノテーション ― クラスやメソッドにメタ情報を付加できる仕組み。
@Override・@Deprecatedなどが代表例。SpringやJUnitなどのフレームワークがアノテーションを読み取って動作を変えるという使い方が広まり、現代のJava開発の中心的な概念になっている - enum ― 定数の集合を型安全に定義できる仕組み。
enum Color { RED, GREEN, BLUE }のように書くと、それ以外の値を受け取れない変数が作れる。それ以前はint定数で代用していたため無効な値が混入するバグが起きやすかった - オートボクシング ―
intとIntegerのような、プリミティブ型とラッパークラスの変換を自動でやってくれる仕組み。List<Integer>に42をそのまま追加できるのはこのおかげ - 可変長引数(varargs)― メソッドの引数を任意の個数受け取れるようにする仕組み。
void log(String... messages)のように書くと、呼び出し側は好きな数だけ引数を渡せる - 拡張for文(for-each)― コレクションや配列の全要素を順に処理するための構文。
for (String s : list)のように書けるようになり、インデックス管理が不要になった
🟡 非推奨
StringBufferの一部用途 ― スレッドセーフ不要な場面ではStringBuilderを推奨(非推奨ではないが慣習的に移行が進んだ)
Java 6(2006年)— 安定と統合
新機能よりもパフォーマンスや互換性の改善に注力。スクリプトAPIやコンパイラAPIなど、ツール開発向けの機能も充実した。
主な追加機能
- スクリプトAPI(JSR 223)― JavaプログラムからJavaScript・Groovyなどのスクリプト言語を実行できる仕組み。文字列として書いたスクリプトをJavaから動的に実行でき、設定やルールを外部スクリプトで差し替えるような用途に使われた
- JDBC 4.0 ― データベースへ接続するための標準API。4.0でドライバの自動読み込みが追加され、それ以前は
Class.forName("...")でドライバを明示的にロードする必要があったのが不要になった。SQLの例外も細分化されエラー原因が特定しやすくなった - JAX-WS ― WebサービスをSOAPプロトコルで呼び出したり提供したりするための標準API。アノテーションベースでWebサービスを簡単に定義できるようになった。現在はREST APIが主流でSOAPはレガシー扱いだが、金融・行政などの古いシステムでは今も現役
- コンパイラAPI ― Javaのコンパイラ(
javac)をプログラムから直接呼び出せる仕組み。実行時にJavaソースコードを動的にコンパイルして読み込む、といったことが可能になった。IDEやコード生成ツールの内部で活用されている
🟡 非推奨
URLDecoder.decode(String)の引数1つ版 ― 文字セット指定必須の2引数版を推奨
Java 7(2011年)— 待望のアップデート
Java 6から5年ぶりのリリース。try-with-resources やダイヤモンド演算子など、書き心地を改善する機能が多数追加された。
主な追加機能
- try-with-resources ― 使い終わったら必ず閉じる必要があるリソースを自動でクローズしてくれる構文。
try (FileReader fr = new FileReader("file.txt")) { ... }のようにブロックを抜けた時点で自動的にclose()が呼ばれる。それ以前はfinallyで手動クローズが必要でリソースリークが頻発していた - ダイヤモンド演算子(
<>)― ジェネリクスの型引数を右辺で省略できるようにする記法。List<String> list = new ArrayList<>();と書けるようになり、冗長な型の繰り返しが不要になった - switch文でStringが使用可能に ― それ以前は
intやcharなどの数値型しか使えなかったが、Stringも条件として使えるようになった。switch (command) { case "start": ... }のように書けるようになりif-elseの連鎖を整理できるようになった - Fork/Joinフレームワーク ― 大きなタスクを再帰的に小さく分割して複数スレッドで並列処理し結果をまとめる仕組み。マルチコアCPUを効率的に使いきるために設計され、Java 8の
parallelStream()もこの仕組みを内部で使っている - NIO.2 ― Java 1.4のNIOをさらに強化したファイルシステムAPI。
Path・Files・FileSystemなどが追加され、ファイルのコピー・移動・属性取得・ディレクトリ監視などが標準ライブラリだけで簡潔に書けるようになった
🟡 非推奨
java.util.jar.Pack200― クラスファイル圧縮ツールだが普及せず非推奨へ(Java 11で正式非推奨、Java 14で削除)
Java 8(2014年)⭐ LTS — 現代的Javaの出発点
ラムダ式とStream APIの導入で関数型スタイルのコーディングが可能になった。Optional や新しい日時API(java.time)も追加され、今なお多くの現場で使われる事実上の「ベースライン」。
主な追加機能
- ラムダ式 ― メソッドを引数として渡せるようにする簡潔な記法。
(x) -> x * 2のように書く。それ以前は匿名クラスを書く必要があり非常に冗長だった。Javaに関数型プログラミングのスタイルをもたらした転換点 - Stream API ― コレクションや配列に対してフィルタリング・変換・集計などの操作をメソッドチェーンで書ける仕組み。
list.stream().filter(...).map(...).collect(toList())のように書け、ループを明示的に書かなくてよくなる。parallelStream()に切り替えるだけで並列処理にもなる - Optional ― 「値があるかもしれないし、ないかもしれない」という状態を型で表現する仕組み。
nullを直接返す代わりにOptional<String>を返すことで呼び出し側にnullチェックを強制でき、NullPointerExceptionを防ぐ設計パターンとして広く使われるようになった - 日時API(java.time)― それまでの
Date・Calendarクラスは設計上の問題(ミュータブル・月が0始まりなど)が多く使いづらかった。LocalDate・LocalDateTime・ZonedDateTimeなどイミュータブルで直感的なクラスが提供され、日付・時刻の扱いが格段に楽になった - デフォルトメソッド ― インターフェースにメソッドの実装を持たせられるようにする仕組み。
defaultキーワードで定義する。既存のインターフェース実装クラスを壊さずに新メソッドを追加するために導入された
🟡 非推奨
java.util.Date・java.util.Calendar―java.timeパッケージへの全面移行を推奨NashornJavaScriptエンジン ― Java 11で非推奨化、Java 15で削除
Java 9(2017年)— モジュール化の時代へ
モジュールシステム(Project Jigsaw)の導入により、大規模アプリの依存関係管理が整理された。インタラクティブなREPL環境JShellも登場。
主な追加機能
- モジュールシステム(Jigsaw)― パッケージをさらに大きな単位「モジュール」にまとめ、どのパッケージを外部公開するか・どのモジュールに依存するかを
module-info.javaで明示的に宣言できる仕組み。JDK自体もこの仕組みで分割され、必要なモジュールだけを含む軽量なJavaランタイムを作れるようになった - JShell(REPL)― コードを1行ずつ書いてすぐ実行結果を確認できる対話型の実行環境。クラスや
mainメソッドを書かなくてもコードを試せるので学習や動作確認に便利。PythonやRubyには昔からあったがJavaにはなかった機能 - HTTP/2クライアント(Incubator)― 従来の
HttpURLConnectionに代わる新しいHTTPクライアントAPI。HTTP/2・WebSocket・非同期処理をサポートし、より現代的な書き方でHTTP通信が書けるようになった。この時点では試験的扱いで、Java 11で正式採用 - コレクションファクトリメソッド(
List.of()など)― 変更不可能なコレクションを簡潔に作れる静的メソッド群。List.of("a", "b", "c")やMap.of("key", "value")のように書けるようになった。それ以前はArrays.asList()やCollections.unmodifiableList()を組み合わせる必要があり冗長だった
🟡 非推奨
AppletAPI ― ブラウザサポート終了に伴い非推奨化(Java 17で削除)Object.finalize()― GC動作の予測が困難なため非推奨化(Java 18で削除)java.activation・java.xml.bindなどのJava EEモジュール ― Java 11で削除
Java 10(2018年)— 型推論の導入
var によるローカル変数の型推論が追加され、冗長な型宣言を省けるように。6ヶ月リリースサイクルへの移行後、初めての非LTS版。
主な追加機能
- ローカル変数型推論(
var)― ローカル変数の型宣言をvarで省略できる仕組み。var list = new ArrayList<String>();のようにコンパイラが右辺から型を推論してくれる。あくまでコンパイル時に型が確定する静的型付けであり、JavaScriptのような動的型付けとは異なる - G1GC 並列Full GC ― Java 9でデフォルトになったG1GCはFull GC発生時だけシングルスレッドで動いていたが、Java 10でFull GCも並列化され、GCによる長い停止時間が改善された
- アプリケーションCDS(Class Data Sharing)― クラスのロード・検証・解析の結果をファイルにキャッシュしておき、次回起動時に再利用することでJVMの起動を高速化する仕組み。コンテナ環境での高速起動への布石となった技術
Java 11(2018年)⭐ LTS — Java 8の正統な後継
HttpClient が標準ライブラリに正式採用。Java 8からの移行先として最も選ばれたLTS版で、主要フレームワークのサポート対象として長く使われた。
主な追加機能
HttpClient(標準化)― Java 9でIncubatorとして導入されたHTTPクライアントAPIが正式採用。HTTP/2・WebSocket・非同期処理に対応しており、それ以前のHttpURLConnectionと比べて格段に使いやすくなった。外部ライブラリなしで現代的なHTTP通信が書けるようになったStringの新メソッド ―isBlank()(空白のみか判定)・strip()(Unicode対応の空白除去。従来のtrim()はUnicode空白を扱えなかった)・lines()(行ごとに分割してStreamで返す)・repeat(n)(n回繰り返す)などが追加されたvarin lambda ― Java 10で導入されたvarをラムダ式の引数にも使えるようになった。(@NonNull var s) -> s.toUpperCase()のようにアノテーションを引数に付けられるという利点がある- ZGC(実験的導入)― 超低遅延を目指して設計された新しいGC。ヒープサイズが数TBに達しても停止時間を数ミリ秒以内に抑えることを目標としている。Java 15で正式採用
🟡 非推奨
NashornJavaScriptエンジン ― GraalVMへの移行を推奨(Java 15で削除)Pack200ツール ― Java 14で削除
🔴 削除
Applet・AppletViewer(一部) ― ブラウザ連携機能の廃止に伴い削除- Java EE・CORBA モジュール(
java.xml.bind・java.xml.wsなど)― Java SEのスコープ外として削除 - JavaFX ― JDKバンドルから分離、OpenJFXとして独立
Java 12(2019年)— Switch式の試み
Switch式がPreviewとして初登場。JVM定数APIなど内部的な改善も含まれる。
主な追加機能
- Switch式(Preview)― 従来のswitch文を「式」として値を返せるようにする新構文。
int result = switch (day) { case MONDAY -> 1; case TUESDAY -> 2; default -> 0; };のように書ける。->を使うことでbreakの書き忘れによるフォールスルーバグも防げる。Java 14で正式採用 - Shenandoah GC ― RedHatが開発した低遅延GC。ヒープサイズに関わらず一定の低遅延を保つ設計が特徴で、ZGCとはアプローチが異なり用途や環境によって使い分けられる。Java 15で正式採用
- JVM定数API ― クラスファイルやランタイムで扱われる定数(クラス・メソッド・フィールドへの参照など)をJavaオブジェクトとして安全に表現するためのAPI。主にツールやフレームワーク開発者向けの低レベルなAPIで、一般的なアプリ開発で直接使う機会は少ない
Java 13(2019年)— テキストブロックの登場
複数行文字列を簡潔に書けるText BlocksがPreviewとして導入。SQLやJSONをコードに埋め込む際の可読性が大幅に向上した。
主な追加機能
- Text Blocks(Preview)― 複数行にわたる文字列を
"""で囲んで書けるようにする構文。HTMLやSQL・JSONをコードに埋め込む際に特に便利で、エスケープ文字や文字列連結が不要になり可読性が大幅に向上した。Java 15で正式採用 - Switch式改良(Preview)― Java 12のSwitch式に
yieldキーワードが追加された。ブロック形式のcase内で値を返すときにcase MONDAY: { int x = calculate(); yield x; }のように書ける - ZGC改良 ― 未使用のヒープメモリをOSに返却する機能が追加された。コンテナ環境でメモリを効率的に使い回せるようになり実用性が向上した
Java 14(2020年)— Switch式が正式に
PreviewだったSwitch式が正式化。instanceof のパターンマッチングやRecordsもPreviewとして登場し、言語進化の方向性が見え始めた。
主な追加機能
- Switch式(正式)― Java 12・13でPreviewだったSwitch式が正式採用。
->構文とyieldキーワードの両方が使えるようになり、本番コードでも安心して使えるようになった instanceofパターンマッチング(Preview)― 型チェックと型キャストを一度に書ける仕組み。if (obj instanceof String s)のように書くだけで型チェックとキャストが同時に行われる。それ以前はinstanceofチェック後に別途キャストが必要だった。Java 16で正式採用- Records(Preview)― データを保持するだけのクラスを簡潔に定義できる仕組み。
record Point(int x, int y) {}の1行でコンストラクタ・getter・equals()・hashCode()・toString()が自動生成される。イミュータブルなデータオブジェクトの定義に最適。Java 16で正式採用 - NullPointerException の詳細メッセージ改善 ― NullPointerException発生時にどの変数がnullだったかを具体的に示すメッセージが出るようになった。それ以前は
NullPointerExceptionとだけ表示されていたが、Cannot invoke "String.length()" because "str" is nullのように原因が一目でわかるようになった
🔴 削除
Pack200ツールおよびAPI ― Java 11で非推奨化後に削除- CMS(Concurrent Mark Sweep)GC ― G1GCなど後継GCへの移行を推奨
Java 15(2020年)— Text Blocksが正式に
Text Blocksが正式化。Sealed クラスがPreviewとして登場し、型の継承関係を明示的に制限できるようになった。
主な追加機能
- Text Blocks(正式)― Java 13・14でPreviewだった
"""で囲む複数行文字列構文が正式採用。本番コードで使えるようになった - Sealed クラス(Preview)― クラスやインターフェースを継承・実装できるクラスを明示的に制限できる仕組み。
sealed class Shape permits Circle, Rectangle, Triangleのように書くと継承できるクラスをその3つだけに限定できる。パターンマッチングと組み合わせることで型の網羅チェックも可能になる。Java 17で正式採用 - Records(2nd Preview)― コンパクトコンストラクタ(バリデーションを簡潔に書く構文)が整備されるなど細部が洗練された。
record Range(int min, int max) { Range { if (min > max) throw new IllegalArgumentException(); } }のようにブロック内でバリデーションを書ける - ZGC・Shenandoah GC 正式化 ― Java 11で実験的導入されたZGCとJava 12で導入されたShenandoah GCがともに正式採用。本番環境で使える低遅延GCの選択肢が公式に増えた
🔴 削除
NashornJavaScriptエンジン ― Java 11で非推奨化後に削除- Solaris/SPARCポート ― メンテナンスコスト対効果から削除
Java 16(2021年)— Recordsが正式に
データ保持に特化したクラスを簡潔に定義できるRecordsが正式化。instanceof パターンマッチングも正式化され、コードの簡潔さが増した。
主な追加機能
- Records(正式)― Java 14・15でPreviewだったRecordsが正式採用。
record Point(int x, int y) {}の1行でデータクラスが定義できる構文が本番コードで使えるようになった instanceofパターンマッチング(正式)― Java 14・15でPreviewだったinstanceofパターンマッチングが正式採用。if (obj instanceof String s)の構文が本番コードで使えるようになった- Vector API(Incubator)― CPUのSIMD命令(1つの命令で複数のデータを同時に処理する仕組み)をJavaから明示的に活用するためのAPI。画像処理・機械学習・科学計算など大量の数値演算を行う処理で大幅な高速化が期待できる。現在も改良が続いている
- Unix ドメインソケット ― 同じマシン上のプロセス間通信をTCPより高速・安全に行う仕組み。ネットワークスタックを通らずファイルシステム上のソケットファイルを介して通信するため低レイテンシで、ポート番号も不要。DockerコンテナやDBとのローカル通信などで使われる
🟡 非推奨
RMI Activationシステム ― 実用例が極めて少ないため非推奨化(Java 17で削除)
Java 17(2021年)⭐ LTS — 言語表現力の大幅強化
Sealed クラスとパターンマッチングの正式採用で、型に基づく条件分岐が格段に書きやすくなった。Spring Boot 3など主要フレームワークがJava 17以上を要件とし、現在の事実上の標準LTS。
主な追加機能
- Sealed クラス(正式)― Java 15・16でPreviewだったSealed クラスが正式採用。パターンマッチングと組み合わせると、switchで全ケースを網羅しているかをコンパイラが検証してくれるようになり、型安全な条件分岐が書きやすくなった
- パターンマッチング switch(Preview)― switchの条件に型パターンを使えるようにする仕組み。
case Integer i ->のように型チェックとキャストを同時に行いながら分岐できる。Sealed クラスと組み合わせると全ケースの網羅チェックも可能。Java 21で正式採用 - 強化された乱数API ―
RandomGeneratorという共通インターフェースが導入され、Random・SecureRandom・SplittableRandomなど複数の乱数生成器を統一的に扱えるようになった。RandomGeneratorFactoryで実装を動的に切り替えることも可能 - macOS Metal レンダリング ― macOSでのJavaのGUI描画にAppleのグラフィクスAPI「Metal」が使われるようになった。それ以前は非推奨になったOpenGLを使っていたため将来的な互換性の問題があった
🔴 削除
AppletAPI ― Java 9で非推奨化後に完全削除RMI Activation(java.rmi.activation)― Java 16で非推奨化後に削除SecurityManager― クラウド・コンテナ時代に合わない設計として非推奨化(Java 17)→ Java 21以降で段階的削除方針
🟡 非推奨
SecurityManager― 将来削除予定として明示的に非推奨化finalize()メソッド ― Java 18でより明示的に非推奨化
Java 18(2022年)— デフォルト文字セットの統一
UTF-8がデフォルト文字セットになり、環境差異によるエンコーディング問題が減少。簡易Webサーバーも標準搭載された。
主な追加機能
- UTF-8をデフォルト文字セットに ― それ以前はJavaの文字セットがOS依存で、WindowsではShift-JIS・LinuxではUTF-8など環境によって異なり文字化けが発生していた。Java 18からはどの環境でもUTF-8がデフォルトになり環境差異による文字化けトラブルが大幅に減った
- Simple Web Server ― コマンド1つ(
jwebserver)で起動できる簡易HTTPサーバーが標準ツールとして追加された。静的ファイルの配信のみに対応しており、本番用途ではなく動作確認やプロトタイピング向け。python -m http.serverのJava版のようなもの - javadoc コードスニペット ― javadocのコメント内にコードサンプルを埋め込む専用タグ
{@snippet}が追加された。それ以前は<pre>タグでHTMLを書く必要がありインデント崩れやHTMLエスケープの問題が起きやすかった。IDEでシンタックスハイライトされ外部ファイルのコードを参照することもできる - Vector API(3rd Incubator)― Java 16で導入されたVector APIの3回目の改良版。APIの使い勝手や対応するCPU命令の範囲が改善されたが引き続きIncubator扱い
🔴 削除
Object.finalize()の実質的な動作保証 ― 非推奨化が強化され、将来の削除に向けた移行促進
🟡 非推奨
finalize()―@Deprecated(forRemoval=true)に格上げ。CleanerAPIへの移行を推奨
Java 19(2022年)— 仮想スレッドの予告
Virtual ThreadsがPreviewとして登場。大量の並行処理をシンプルなコードで書けるという未来が見え始めた重要なリリース。
主な追加機能
- Virtual Threads(Preview)― JVM上で管理される軽量なスレッド。従来のJavaスレッドはOSスレッドと1対1対応でメモリ消費が大きかったが、Virtual Threadsは数百万単位で作成しても問題ない。既存の
ThreadAPIとほぼ同じ書き方で使えるため、コードをほぼ変えずに大量並行処理が実現できる。Java 21で正式採用 - Structured Concurrency(Incubator)― 複数の並行タスクをひとまとまりとして扱いライフサイクルを管理しやすくする仕組み。「2つのAPIを並行して呼び、どちらかが失敗したらもう一方もキャンセルする」といった処理を安全かつ簡潔に書ける
- Record Patterns(Preview)―
instanceofのパターンマッチングをRecordsに対応させた拡張。if (obj instanceof Point(int x, int y))のようにRecordsのフィールドを分解して直接変数に束縛できる。ネストしたRecordsも一度に分解可能。Java 21で正式採用 - Foreign Function & Memory API(Preview)― JavaからC言語などのネイティブライブラリを呼び出したりJVMの外のメモリを安全に操作したりするためのAPI。それ以前は
JNIを使う必要がありC言語のコードも書く必要があって非常に複雑だった。Java 22で正式採用
Java 20(2023年)— 仮想スレッドの熟成
Virtual Threads が2nd Previewへ。各種APIの安定化が進み、Java 21での正式化に向けた最終調整期。
主な追加機能
- Virtual Threads(2nd Preview)― Java 19の改良版Preview。APIの細部が洗練され、Java 21での正式採用に向けた最終調整
- Record Patterns(2nd Preview)― Java 19の改良版Preview。ネストしたパターンの扱いなどが改善された
- Scoped Values(Incubator)―
ThreadLocalの後継となる仕組み。Virtual Threadsと相性が悪かったThreadLocalの問題を解決し、親スレッドから子スレッドへ値を安全に引き継げる - Vector API(5th Incubator)― 5回目の改良版。CPUのSIMD命令活用のための改善が継続中
Java 21(2023年)⭐ LTS — 並行処理の革命
Virtual Threads(仮想スレッド)の正式採用が最大のトピック。従来モデルでは難しかった大量の同時接続処理をシンプルなコードで実現できるようになり、Javaのサーバーサイド性能が飛躍的に向上した。
主な追加機能
- Virtual Threads(正式)― Java 19・20でPreviewだった仮想スレッドが正式採用。数百万単位の軽量スレッドを扱えるようになり、サーバーサイドの大量リクエスト処理が劇的にシンプルになった
- Record Patterns(正式)― Java 19・20でPreviewだったRecord Patternsが正式採用。
instanceof Point(int x, int y)の構文が本番コードで使えるようになった - パターンマッチング switch(正式)― Java 17からPreviewだった型パターンを使ったswitch式が正式採用。Sealed クラスとの組み合わせによる網羅チェックも本番で使えるようになった
- Sequenced Collections ― 順序を持つコレクションを統一的に扱うインターフェース群。
getFirst()・getLast()・reversed()などのメソッドが追加され、それ以前はコレクションの種類ごとにバラバラだった書き方が統一された - Structured Concurrency(Preview)― Java 20でIncubatorだったものがPreviewに昇格。複数の並行タスクをひとまとまりとして管理する仕組みが安定化に向けて改善された
🟡 非推奨
Thread.countStackFrames()― Virtual Threads導入に伴い意味をなさなくなったため非推奨化ThreadGroupの一部メソッド(stop()・destroy()など)― Virtual Threads時代に不要なため非推奨化
Java 22(2024年)— FFMの正式化
Foreign Function & Memory APIが正式化され、JVMの外のネイティブメモリやC関数をJavaから安全に呼び出せるようになった。
主な追加機能
- Unnamed Variables & Patterns(正式)― 使わない変数を
_で明示的に無視できる仕組み。catch (Exception _)やcase Point(int x, _)のように書ける - Foreign Function & Memory API(正式)― Java 19からPreviewだったネイティブライブラリ呼び出しAPIが正式採用。JNIを使わずJavaコードだけでC言語ライブラリの呼び出しやオフヒープメモリ操作が書けるようになった
- Gather/Scatter I/O ― 複数のバッファをまとめて一度に読み書きできるI/O操作。バッファをつなぎ合わせる際のコピーコストを削減できる
- String Templates(2nd Preview)― 文字列の中に式を埋め込める仕組み。
STR."Hello \{name}!"のように書けるが、設計上の問題からJava 23で完全撤回された
🔴 削除
String Templates(後にPreview廃止)― 設計の見直しが必要と判断され、Java 23でいったんPreviewから取り下げ
Java 23(2024年)— 言語文法の細かな進化
Primitive Types in Patterns やModule Import宣言などがPreviewとして登場。javadocのMarkdown対応も追加され、ドキュメント記述が楽になった。
主な追加機能
- Primitive Types in Patterns(Preview)― パターンマッチングで
int・longなどのプリミティブ型も使えるようにする拡張。case int i ->のように書ける。それ以前はラッパークラスへの変換が必要だった - Flexible Constructor Bodies(Preview)― コンストラクタ内で
super()を呼び出す前に処理を書けるようにする拡張。それ以前はsuper()が必ず先頭でなければならなかった - Module Import 宣言(Preview)―
import module java.base;と書くだけでモジュール内の全パッケージがインポートされる。import記述の手間が減る - Markdown形式のJavadoc ―
///で始まるコメントブロックでMarkdown記法が使えるようになった。従来のHTMLタグだらけのjavadocより可読性が大幅に向上した
🔴 削除
String Templates(JEP 430)― 再設計のためPreviewから完全取り下げstrictfpキーワードの実質的効果 ― Java 17以降は常にstrictfp動作になったため意味を失った(キーワード自体はコンパイルエラーにならないが将来削除予定)
Java 24(2025年)— 起動速度の改善
Ahead-of-Timeクラス読み込みにより、JVMの起動時間が大幅に短縮。コンテナ環境やサーバーレス環境での実用性が向上した。
主な追加機能
- Ahead-of-Time クラス読み込み ― アプリ起動時のクラスロード結果をキャッシュし次回起動時に再利用することでJVMを高速起動する仕組み。Java 10のCDSをさらに発展させたもので、コンテナ・サーバーレス環境に効果的
- Compact Object Headers ― JVMオブジェクトのヘッダー情報を96ビットから32ビットに削減する最適化。メモリ使用量の削減とキャッシュ効率向上につながり、大量のオブジェクトを扱うアプリで特に効果が出る
- Class-File API(正式)― Javaのクラスファイル(
.class)を読み書き・操作するための標準API。それ以前はASMなどのサードパーティライブラリが必要だった。フレームワークやビルドツール開発者向け - Stream Gatherers(正式)― Stream APIにカスタムの中間操作を追加できる仕組み。既存の
filter()・map()では表現できない複雑な処理を自分で定義してStreamに組み込める
🔴 削除
sun.misc.Unsafeのメモリアクセスメソッド群 ― Foreign Function & Memory APIへの移行を推奨。段階的削除の方針が明確化
🟡 非推奨
- 32ビットWindowsポート ― メンテナンスコスト増大により将来削除予定
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK