未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】ラッパークラス Part2

title

前回に引き続きラッパークラスを解説します。 phoeducation.work


ラッパークラスのメソッド

ラッパークラスのコンストラクタを使ってラッパークラスのオブジェクトを作成する以外に、ラッパークラスには基本データ型やString型をラッパークラスのオブジェクトに変換するメソッドが用意されています。

また逆にラッパークラスオブジェクトを基本データ型に変換するメソッドも用意されています。


引数に指定された値をIntegerオブジェクトに変換するvalueOf()メソッド

valueOf()メソッド
※Characterクラス以外のラッパークラスにもvalueOfメソッドは定義されています。


引数に指定された値をint型に変換するparseInt()メソッド

parseInt()メソッド
※その他各ラッパークラスには、parseShort()、parseLong()、parseFloat()、parseDouble()が用意されています。


基本データ型に変換するXXXValue()メソッド

XXXValue()メソッド
※その他各ラッパークラスには、shortValue()、longValue()、floatValue()、doubleValue()が用意されています。


【ラッパークラスのvalueOf()メソッド】

public class WrapperSample3 {
     public static void main(String[] args) {
          Integer obj1 = Integer.valueOf("100");
          Short obj2 = Short.valueOf("200");
          Long obj3 = Long.valueOf("300");
          Float obj4 = Float.valueOf("400");
          Double obj5 = Double.valueOf("500");


          System.out.println(obj1 + obj2 + obj3 + obj4 + obj5);
     }
}

実行結果

1500.0


各ラッパークラスのvalueOf()メソッドはstaticメソッドです。

クラス名.メソッド名として指定をしますので、Integer.valueOf()という形になります。

また引数には対応した基本データ型もしくはString型を取ることができます。


上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。

この変換により数値としての性質を保持することができたので、10行目で演算ができることがわかります。


【ラッパークラスのparseXXX()メソッド】

public class WrapperSample4 {
    public static void main(String[] args) {
        Integer obj1 = Integer.parseInt("100");
        Short obj2 = Short.parseShort("200");
        Long obj3 = Long.parseLong("300");
        Float obj4 = Float.parseFloat("400");
        Double obj5 = Double.parseDouble("500");
        System.out.println(obj1 + obj2 + obj3 + obj4 + obj5);


        Integer obj6 = Integer.parseInt("abc");
    }
}

実行結果

1500.0
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at WrapperSample4.main(WrapperSample4.java:11)


各ラッパークラスのparseXXX()メソッドはstaticメソッドです。

クラス名.メソッド名として指定をしますので、Integer.parseInt()という形になります。

また引数には対応した基本データ型もしくはString型を取ることができます。


上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。

この変換により数値としての性質を保持することができたので、8行目で演算ができることがわかります。

また11行目では指定された引数が数値に変換できないので、NumberFormatException例外が発生しています。


【ラッパークラスのXXXValue()メソッド】

public class WrapperSample5 {
    public static void main(String[] args) {
        Integer obj1 = Integer.parseInt("100");
        int i = obj1.intValue();

        Short obj2 = Short.parseShort("200");
        short s = obj2.shortValue();

        Long obj3 = Long.parseLong("300");
        long l = obj3.longValue();

        Float obj4 = Float.parseFloat("400");
        float f = obj4.floatValue();

        Double obj5 = Double.parseDouble("500");
        double d = obj5.doubleValue();

        System.out.println(i + s + l + f + d);
    }
}

実行結果

1500.0


各ラッパークラスのXXXValue()メソッドはインスタンスメソッドです。

オブジェクト名.メソッド名として指定をします。


3、6、9、12、15行目で各ラッパークラスのオブジェクトを作り、7、10、13、16行目でXXXValue()メソッドを使って、基本データ型へ変換しています。

また引数には対応した基本データ型もしくはString型を取ることができます。


上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。

この変換により数値としての性質を保持することができたので、18行目で演算ができることがわかります。

もし数値として変換できないような値(例えば"ABC"など)を引数に指定すると、NumberFormatExceptionのエラーが発生します。


ラッパークラスのequals()メソッド

ラッパークラスではObjectクラスのequals()メソッドがオーバーライドされて定義されています。

Objectクラスのequals()メソッドはオブジェクトが同じかどうかを調べるものでしたが、ラッパークラスのequals()メソッドはStringクラスのequals()メソッド同様に、格納されている値が同じかどうかを調べます。

ただし同じラッパークラス同士で、同じ値のみtrueを返します。たとえ値が同じでも、異なるラッパークラス同士ではfalseを返します。


【ラッパークラスのequals()メソッド】

public class WrapperSample6 {
    public static void main(String[] args) {
        Integer in1 = new Integer(123);
        Integer in2 = new Integer("123");

        Short sh1 = new Short("123");
        Short sh2 = new Short("123");

        System.out.println(in1.equals(in2));
        System.out.println(sh1.equals(sh2));
        System.out.println(in1.equals(sh1));

    }
}

実行結果

true
true
false


3行目と4行目では同じ値を持つIntegerオブジェクトを作成しています。

また6行目と7行目では同じ値を持つShortオブジェクトを作成しています。

9行目と10行目は同じクラスの同じ値のオブジェクトなのでtrueを返します。

11行目はShort型のオブジェクトをInteger型と比較しているため、値は同じですが、falseが返されています。

equals()メソッド


autoboxing/unboxing機能

これまでラッパークラスのコンストラクタやメソッドを使って基本データ型をラッパークラス型に変換してきましたが、JDK5.0からこれらの変換を自動で行うautoboxing/unboxing機能が追加されました。


boxing機能は基本データ型をラッパークラスへ、unboxing機能はラッパークラスを基本データ型へ変換します。


ただし、ラッパークラスでないオブジェクトをunboxingしようとするとNullPointerException例外が発生します。

autoboxing/unboxing


autoboxing/unboxing機能の注意事項

  1. autoboxing機能において暗黙の型変換は行われない。またラッパークラス同士の型変換も行われない。
  2. autoboxing機能によってラッパークラスオブジェクトが生成される時、メモリ効率を図るため、次の場合は同じオブジェクトを参照する。
    ・ trueまたはfalseのboolean値
    ・ int型、shot型の-128~127の範囲の整数
    ・ byte型の-128~127の範囲の整数
    ・ \u0000~\u007Fの範囲の文字
  3. equals()メソッドを利用した比較では、Integer型では同じint型を含むIntegerオブジェクトである場合、trueとなる。


【autobxing/unboxing機能1】

public class BoxingSample1 {
    public static void main(String[] args) {
        int i = 100;
        Integer obj = 200;
        int sum = i + obj;
        System.out.println(sum);
    }
}

実行結果

300


3行目でint型の変数iに100を代入しています。4行目で200というint型の値をautoboxing機能によりInteger型に変換して変数objに格納しています。

5行目ではInteger型の変数objをunboxing機能によりint型に変換して、int型同士で演算子をし、int型の変数sumに代入しています。


【autobxing/unboxing機能2】

public class BoxingSample2 {
    public static void main(String[] args) {
        double d1 = 3.14f;  //float型からdouble型への暗黙の型変換
        Float  d2 = 3.14f;  //float型からFloat型へのautoboxing
        Double d3 = d2;     //Float型からDouble型への変換


        long l1 = 10;    //int型からlong型への暗黙の型変換
        Long l2 = l1;    //long型からLong型へのautoboxing
        Float l3 = l2;   //Long型からFloat型への変換

    }
}


コンパイルエラー


3行目では基本データ型のfloat型の値を基本データ型のdouble型に変換しています。

これは暗黙の型変換なので問題はありません。

4行目では基本データ型のfloat型をラッパーラスのFloat型にautoboxingしています。


5行目ではFloat型をDouble型に代入してようとしていますが、ラッパークラス同士の型変換は行われないので、コンパイルエラーになります。

8行目ではint型のリテラルをlong型に変換しています。

これは暗黙の型変換なので問題ありません。

9行目ではlong型をLong型にautoboxingしていますので、問題ありません。

10行目はLong型をFloat型に変換しようとしていますが、異なる型のラッパークラス同士の変換なので、コンパイルエラーになります。


【autobxing/unboxing機能3】

public class BoxingSample3 {
    public static void main(String[] args) {
        Boolean b1 = true;
        Boolean b2 = true;
        System.out.println("b1 == b2 : " + (b1 == b2));

        Integer i1 = 10;
        Integer i2 = 10;
        System.out.println("i1 == i2 : " + (i1 == i2) );
        System.out.println("i1.equals(i2) : " +(i1.equals(i2)) );

        Integer i3 = 128;
        Integer i4 = 128;
        System.out.println("i3 == i4 : " +(i3 == i4) );
        System.out.println("i3.equals(i4) : " +(i3.equals(i4)) );

    }
}

実行結果

b1 == b2 : true
i1 == i2 : true
i1.equals(i2) : true
i3 == i4 : false
i3.equals(i4) : true


3行目と4行目ではBoolean型のオブジェクトを生成しています。

Boolean型では値がtrue同士もしくはfalse同士であれば同じオブジェクトを参照しますので、==演算子による比較はtrueを返します。

7行目と8行目ではint型の10という値をautoboxing機能でInteger型に変換しています。

Integer型の場合-128~127の範囲の値は同じオブジェクトを生成しますので、==演算子の比較はtrueになり、equals()メソッドの値比較でもtrueになります。

12行目と13行目では-128~127の範囲外である128を値としてIntegerオブジェクトを生成しているので、i3とi4は別々のオブジェクトとなります。

したがって==演算子ではfalseを返し、equals()メソッドではtrueを返します。


equals()メソッド


まとめ

  • ラッパークラス

    • 基本データ型の性質をそのまま受け継いだオブジェクト型です。

    • ラッパークラスには、基本データ型に合わせて、Byte、Short、Integer、Long、Character、Float、Double型があります。

    • 基本データ型をラッパークラスオブジェクトにするには、コンストラクタを使う方法とメソッドを使う方法があります。

    • ラッパークラスのequals()メソッドは、Objectクラスのequals()メソッドをオーバーライドして、値が等しいかどうかを判定します。

    • オブジェクト型と基本データ型を変換する際に、autoboxing/unboxing機能が働き、明示的に変換するソースコードを記述しなくてもよいです。



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work phoeducation.work



【まついのLINE公式アカウントはこちらから!】
Line公式アカウント