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クラスは以前から先頭文字の+を扱うことができたのでした。

この先は会員の登録が必要です。有料会員(月額プラン)は申し込み初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら