Java SE 7はJSRになるような大きな変更は少ないのですが、細かい変更は非常に多く、しかも多岐にわたっています。そんな細かい変更のうち、今回はjava.langパッケージおよびjava.utilパッケージの変更点について紹介していきます。
なお、java.langパッケージに含まれるクラスローダは比較的大きな変更が施されました。そこで、クラスローダに関しては別の機会に紹介し、今回は省略させていただきました。
java.langパッケージ
プリミティブ型の比較
Booleanクラス、Byteクラス、Characterクラス、Integerクラス、Longクラス、Shortクラスに、比較のためのstaticなcompareメソッドが追加されました。
staticではないcompreToメソッドが引数が一つなのに対し、staticなcompareクラスは引数を二つ取り、引数同士を比較します。
戻り値は第1引数が大きい場合、正の整数が戻ります。同様に、第2引数が大きければ負の整数、同一値であれば0が戻ります。Booleanクラスのcompareメソッドは、第1引数をx、第2引数をyとすると、戻り値は次のようになります。
- x == y の場合、0を返す
- !x && y の場合、負の整数を返す
- x && !y の場合、正の整数を返す
たとえば、int同士を比較するには、次のように記述します。
int x = ...;
int y = ...;
int result = Integer.compare(x, y);
compareメソッドの実装は効率を求めたとかそういうことはなく、ごくごく普通の実装となっています。例として、Integerクラスのcompareメソッドを示します。
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
なお、DoubleクラスとFloatクラスはJ2SE 1.4からcompareメソッドが提供されています。今まで、なぜ他のラッパークラスにはcompareメソッドがなかったのか不思議ですね。
文字列のパース
IntegerクラスのparseIntメソッドは文字列をパースして、intを返します。同じようなメソッドはByteクラス、Longクラスなどにも定義されています。
これらのメソッドは文字列の先頭文字が- (マイナス)の場合パースできるのですが、+ (プラス)だとパースできないという問題がありました。これに対し、JavaSE 7になってやっと+でも使用できるようになりました。
String text = "+100";
int number = Integer.parseInt(text);
parseIntメソッドも実装がどのように変化したのか確認しておきましょう。Java SE 6のparseIntメソッドをリスト4、Java SE 7のparseIntメソッドをリスト5に示しました。
public static int parseInt(String s, int radix)
throws NumberFormatException
{
<<省略>>
int result = 0;
boolean negative = false;
int i = 0, max = s.length();
int limit;
int multmin;
int digit;
if (max > 0) {
if (s.charAt(0) == '-') {
negative = true;
limit = Integer.MIN_VALUE;
i++;
} else {
limit = -Integer.MAX_VALUE;
}
<<省略>>
public static int parseInt(String s, int radix)
throws NumberFormatException
{
<<省略>>
int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
int multmin;
int digit;
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+')
throw NumberFormatException.forInputString(s);
if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++;
}
<<省略>>
Java SE 6 では-としか比較していなかった部分がJava SE 7では赤字で示したように+との比較も行うようになっています。
なお、parseIntメソッド以外にも、文字列を引数にとるコンストラクタ、decodeメソッド、valueOfメソッドなどで+のついた文字列をパースすることができるようになりました。
また、同様にByteクラス、Shortクラス、Longクラス、BigIntegerクラスでも先頭文字が+の文字列をパースすることができます。しかし、DoubleクラスとFloatクラスはどうなのでしょうか。
実を言うと、先ほどのcompareメソッドと同様に、すでにDoubleクラスとFloatクラスは以前から先頭文字の+を扱うことができたのでした。