次の項目について説明します。
配列の並列ソート機能では、Arraysクラスで現在提供されている同じ一連のソート操作が追加されていますが、分岐/結合フレームワークを利用する並列実装も提供されます。JSR 166分岐/結合並列化共通プールを使用して配列の並列ソートを提供する新しいユーティリティ・メソッドがjava.util.Arraysに追加されました。それらのメソッドはparallelSort()と呼ばれ、すべてのプリミティブ・データ型およびComparableオブジェクト用にオーバーロードされます。詳細は、JEP 103を参照してください。
新しいメソッドについては、Javaチュートリアル(配列に関するトピックおよび分岐/結合に関するトピック)に説明されています。
Base64
クラスは、Base64データをエンコードおよびデコードするEncoder
およびDecoder
インスタンスを取得するためのファクトリ・メソッドを定義します。Base64SampleおよびBase64Sample2は、Base64
クラスについて記述したコード例です詳細は、「JEP 135: Base64 Encoding and Decoding」を参照してください。
符号なし整数演算をサポートするためのメソッドがJavaライブラリに追加されました。整数は32ビットから成る数値で、そのうちの1ビットは符号用に予約されていますが、このような符号なしメソッドを使用すると、32ビットすべてを使用できるようになります。parseUnsignedLong
、toUnsignedString
、divideUnsigned
、compareUnsigned
などのstaticメソッドがLong
クラスに追加され、divideUnsigned
、compareUnsigned
、parseUnsignedInt
、remainderUnsigned
、toUnsignedString
などのメソッドがInteger
クラスに追加されました。これらのメソッドにはプリミティブ・データ型の最適化機能が含まれているため、算術演算にBigDecimal
やBigInteger
を使用するよりも処理速度が向上します。
分野: コア・ライブラリ/ java.lang.reflect
概要: 指定されたInvocationHandlerパラメータがnullの場合に、java.lang.reflect.Proxy(InvocationHandler h)コンストラクタがNullPointerExceptionをスローするようになりました。
非互換性の性質: 動作
説明: null引数で動的プロキシ・インスタンスを構成する既存のコードはNullPointerExceptionを取得するようになります。いずれにしてもそのメソッドが呼び出されたときは、nullプロキシ・インスタンスは必要がなく、NullPointerExceptionがスローされることになるため、そのように使われる可能性はほとんどないと予想されます。
RFE: 4487672
さらに、次の拡張機能が導入されています。
分野: API:言語
Standard/Platform: Java SE 7
概要:カスタム・クラス・ローダーが非循環式のクラス・ローダー委譲モデルに準拠していない場合は、クラス・ロード時にデッドロックが発生する可能性があります。クラスの並行ロード、およびクラス・ロード操作のためのより詳細なロック・メカニズムをサポートするために、新しいAPIがjava.lang.ClassLoaderクラスに追加されました。カスタム・クラス・ローダーでこの機能を活用するには、推奨モデルと要件について「Class Loader API Modifications for Deadlock Fix」ドキュメントを参照し、カスタム・クラス・ローダーを適切に実装する必要があります。
分野: API: 言語
Standard/Platform: JDK 7
概要: 以前は、javax.lang.model.typeパッケージの2つの例外型MirroredTypeExceptionとMirroredTypesExceptionは無関係でした。javac実装では、MirroredTypesExceptionがスローされるべきところでMirroredTypeExceptionがスローされていました。この問題に対処するためもあって、MirroredTypeExceptionがMirroredTypesExceptionのサブクラスになりました。この変更はバイナリ互換であり、既存の注釈プロセッサの動作を通常は保持します。ただし、この変更によってクライアント・プログラムのソースの互換性が失われる可能性があります。そのような場合は、catch節の順序を変更することで、プログラムは再度コンパイル可能になるはずです。
分野: API: 言語
Standard/Platform: JDK 7
概要: このリリースの言語の変更をモデル化するために、javax.lang.model.type.TypeVisitorインタフェースにメソッドが追加されるなど、いくつかの更新がjavax.lang.model.*に加えられました。そのような追加により、TypeVisitorインタフェースを直接実装しているライブラリとはソースの互換性がなくなります。ただし、そのような追加はこのAPIの展開の一部として予見されていました。また、ライブラリはそのようなインタフェースを直接実装するのではなく、ユーティリティ・ビジターの1つを拡張するよう、明示的に警告されていました。
RFE: 6933147
分野: API: 言語
Standard/Platform: JDK 7
概要: メソッドRuntime.exec(String command, String[] envp, File dir)
はコマンド文字列を、デフォルトの区切り文字セット(空白文字、タブ文字、改行文字、復帰改行文字および用紙送り文字)を使用する呼出しnew StringTokenizer(command)
によって、実行可能ファイルの名前とその引数で構成されるトークンに分割します。すなわち、このメソッドは空白を区切り文字として使用して、コマンド文字列をトークンに分割します。
Windowsオペレーティング・システムでは、コマンド・パラメータを空白文字で分割するとエラーになることがあります。特に、command
パラメータに、空白を含む実行可能ファイルへのパスが含まれている場合、new StringTokenizer(command)
の呼出しによって、間違った実行可能ファイル名が抽出されます。たとえば、Runtime.getRuntime().exec("C:\\My Programs\\foo.exe bar")
の呼出しにより、引数Programs\foo.exe
およびbar
を指定してプログラムC:\My
を起動しようとします。この呼出しは、実行可能ファイルC:\My
が見つからないことを示す例外で失敗する可能性があります。
従来のアプリケーションでセキュリティ・マネージャが使用されていない場合(クラスSecurityManager
を参照)、システム・プロパティjdk.lang.Process.allowAmbiguousCommands
をfalse
以外の任意の値で指定することによって、空白を含むパス名を、メソッドRuntime.exec
で正しく解析することができるようになります。(Javaチュートリアルのシステム・プロパティに関するトピックを参照してください。)または、パス名を引用符で囲むこともできます。たとえば、Runtime.getRuntime().exec("\"C:\\My Programs\\foo.exe\" bar")
の呼出しにより、引数bar
を指定してC:\My Programs\foo.exe
を起動しようとします。
注: Update 25の後の更新では、あいまいなコマンドを許可するシステム・プロパティの名前はjdk.lang.Process.allowAmbiguousCommands
です。
分野: API: ユーティリティ
Standard/Platform: JDK 7
概要: 以前は、java.util.TreeMapのエラーのため、空のTreeMapsおよびTreeSetsに無効なnull要素やComparableを実装していない要素を挿入できました。空のTreeMapsまたはTreeSetsに無効な要素を1つだけ挿入できました。さらに要素を挿入すると、想定されたNullPointerExceptionまたはClassCastExceptionが発生していました。コレクションに対する他の操作も、ほとんど失敗していました。JDK 7以降は、空のTreeMapまたはTreeSetに無効なnull要素やComparableを実装していない要素を挿入すると、NullPointerExceptionがスローされます。RFE: 5045147
ProcessBuilder
クラスでは、Runtime.execよりも簡単にサブプロセスを呼び出すことができます。実際、ProcessBuilderを使用すると、変更されたプロセス環境(つまり、親のプロセス環境をベースにしてわずかに変更を加えた環境)でサブプロセスを開始することが簡単になりました。java.lang.Thread
クラスには、次の拡張機能が追加されました。
Thread.State
クラスと新しいgetState()
APIが用意されました。Thread
クラスのgetStackTrace
およびgetAllStackTraces
メソッド。プログラミングにより、1スレッドまたはすべてのスレッドのスタック・トレースを取得できます。uncaughtExceptionHandler
メカニズムが、Threadクラスを介して直接利用できるようになりました。sleep()
メソッドの新しい形式により、1ミリ秒未満のスリープ時間が可能になりました。java.lang.instrument
パッケージでは、メソッドのバイト・コードを実行時に変更することでJavaプログラミング・エージェントが仮想マシン上で実行されるプログラムを計測することを可能にするサービスを提供します。Formatter
クラスでは、レイアウトの調整および位置ぞろえ、数値、文字列、および日付と時間のデータの一般的な書式、さらにはロケール固有の出力について、サポートしています。byte
、java.math.BigDecimal
、java.util.Calendar
などの一般的なJavaの型をサポートします。任意のユーザー型に対する限定的な書式のカスタマイズについては、java.util.Formattable
インタフェースを使用します。java.util.Scanner
クラスは、テキストをプリミティブ型またはString
型に変換します。このクラスはjava.util.regex
パッケージを基にしているため、ストリーム、ファイル・データ、文字列、またはReadable
インタフェースの実装者に対する正規表現ベースの検索を実行する方法も用意されています。split
メソッドが新しく追加されました。subSequence
メソッドが追加されました(String
が実装するようになったCharSequence
インタフェースで必要)。matches
、replaceAll
、およびreplaceFirst
という3つのメソッドが追加されました。subSequence
メソッドが追加されました(StringBuffer
が実装するようになったCharSequence
インタフェースで必要)。interrupt
メソッドが、チャネル入出力操作でブロックされるスレッドに割込めるように改訂されました。java.util.prefs
パッケージが実装するPreferences APIを使用すれば、ユーザーおよびシステムの設定および構成データをアプリケーションから格納および取得できます。このデータは、実装ごとに異なるバッキング・ストアに永続的に保存されます。Preferences APIは、java.util.Properties
クラスの使用頻度の高いプロパティを置き換える目的で設計されており、軽量さを維持しながら、さまざまな点を訂正しています。java.lang.StrictMath
- java.lang.StrictMath
クラスのAPIは、古いjava.lang.Math
クラスのAPIと同じです。java.lang.Mathクラスは、以前のバージョンのJavaプラットフォームから存在しています。ただし、Math
クラスと異なり、StrictMath
クラスは、すべての実装でビットごとの再現可能な結果を返すように定義されています。java.lang.Math
- クラスjava.lang.Math
は、クラスStrictMath
と同じAPIのセットを提供します。ただし、クラスStrictMath
の一部の数値関数とは違って、クラスMath
の等価な関数のすべての実装は、ビット単位まで同じ結果を返すようには定義されておらず、特定の制約内で結果が異なることがあります。このため、厳密な再現性が要求されない実装においてパフォーマンスの向上が可能になります。Countdown.java
は、Timer APIを使用した簡単なデモ・アプリケーションです。java.lang.Runtime
には、3つのメソッドが追加され、この機能に対して移植性のある簡単なインタフェースが提供されます。新しいメソッドは次のとおりです。
また、Runtime.exit
メソッドも改訂されました。詳細は、「シャットダウン・フックAPIの設計」を参照してください。java.util.zip
およびjava.util.jar
クラスのAPIが拡張され、次のモードが追加されました。
java.util.zip.OPEN_READ
java.util.zip.OPEN_DELETE
java.util.zip.ZipFile(File file, int mode)
java.util.jar.JarFile(File file, boolean verify, int mode)
JarURLConnection
を開くたびに、Jarファイルの日付を保持する一時ローカル・ファイルが作成され、JarFileオブジェクトがその一時ファイルの先頭に作成されます。このとき、各一時ファイル上で開いているファイル・ハンドルおよび記述子が閉じなかったため、サーバー・アプリケーションを長時間実行している場合は、一時ファイルによってディスク容量がすぐにいっぱいになる可能性がありました。この新しいAPIでは、ZipファイルおよびJarファイルを開くときに、新しいdelete-on-closeモードを使用できるので、この問題を解決できます。