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同士を比較するには、次のように記述します。

リスト1●intの比較
        int x = ...;
        int y = ...;

        int result = Integer.compare(x, y);

 compareメソッドの実装は効率を求めたとかそういうことはなく、ごくごく普通の実装となっています。例として、Integerクラスのcompareメソッドを示します。

リスト2●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になってやっと+でも使用できるようになりました。

リスト3●先頭に+が入った文字列のパース
        String text = "+100";
        int number = Integer.parseInt(text);

 parseIntメソッドも実装がどのように変化したのか確認しておきましょう。Java SE 6のparseIntメソッドをリスト4、Java SE 7のparseIntメソッドをリスト5に示しました。

リスト4●parseIntメソッド (Java SE 6)
    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;
            }
        <<省略>>

リスト5●parseIntメソッド (Java SE 7)
    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クラスは以前から先頭文字の+を扱うことができたのでした。