覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

文字型(char型)に対するInteger.valueOfの結果

Java で 数字の文字列を int型に変換する際には、Integer.valueOf を利用するのが一般的です。

例えば以下のような感じ。

public class ToInteger {
    public static void main(String[] args) {
        System.out.println(Integer.valueOf("1"));
        System.out.println(Integer.valueOf("2"));
        System.out.println(Integer.valueOf("3"));
        System.out.println(Integer.valueOf("4"));
        System.out.println(Integer.valueOf("5"));
    }
}


出力結果

1
2
3
4
5

なんの変哲もない結果です。


では、これをString型ではなくchar型でやってみましょう。

public class ToInteger {
    public static void main(String[] args) {
        System.out.println(Integer.valueOf('1'));
        System.out.println(Integer.valueOf('2'));
        System.out.println(Integer.valueOf('3'));
        System.out.println(Integer.valueOf('4'));
        System.out.println(Integer.valueOf('5'));
   }
}


出力結果

49
50
51
52
53

ほとんどの人が望んでいない結果が出力されています。


最初のString型でのInteger.valueOfInteger.valueOf(String s) が呼び出されていますが、
後者のchar型の場合は、Integer.valueOf(int i) が呼び出されています。

というわけでchar型の場合 int型にキャストされて Integer.valueOf が呼び出されているのと同様です。


char型の値を int型 にキャストした値を出力してみると

public class ToInteger {
    public static void main(String[] args) {
        System.out.println((int) '1');
        System.out.println((int) '2');
        System.out.println((int) '3');
        System.out.println((int) '4');
        System.out.println((int) '5');
    }
}


出力結果

49
50
51
52
53

さきほどと同様の結果が出力されます。これはASCIIコードになっている状態です。


では、数字を意味するchar型をそのままの見た目の数値に変換したい場合、どうすればいいかというと Character.getNumericValue というメソッドが用意されているので、これを使いましょう。

public class ToInteger {
    public static void main(String[] args) {
        System.out.println(Character.getNumericValue('1'));
        System.out.println(Character.getNumericValue('2'));
        System.out.println(Character.getNumericValue('3'));
        System.out.println(Character.getNumericValue('4'));
        System.out.println(Character.getNumericValue('5'));
    }
}


出力結果

1
2
3
4
5

望んだ結果となりました。


まとめ

Java で char型を利用するケースが必ずしも多くないため、こんな挙動について知らなくてもいいかもしれないですが、
はまると一瞬混乱を招くので、一応Character.getNumericValueなどの存在も知っておいても損は無いかもしれません。