基本型と参照型
Java のデータ型は基本型と参照型に分類されます。基本型には null は代入できません。基本型には null 以外の初期値があり、boolean は false、int や long は 0 です。
class Main {
    public static void main(String args[]) {
        // 基本型
        boolean b = true;
        byte by = 127; // -128 ~ 127
        char c = 65535; // 0 ~ 65535 (2byte)
        short s = 32767; // -32768 ~ 32767 (2byte)
        int i = 1; // 4byte
        long l = 1L; // 8byte
        float f = 1.0F;
        double d = 1.0;
        // 参照型
        String str = "abc";
        Object obj = null;
        // ラッパークラス (参照型の一部, java.lang.*)
        Boolean bb = new Boolean(b);
        Byte bby = new Byte(by);
        Character cc = new Character(c);
        Short ss = new Short(s);
        Integer ii = new Integer(i);
        Long ll = new Long(l);
        Float ff = new Float(f);
        Double dd = new Double(d);
    }
}
参照型の比較は以下のようになります。
class Main {
    public static void main(String args[]) {
        // 参照先が同じであるかどうかの比較
        String str = "abc";
        String str2 = str;
        String str3 = "abc";
        System.out.println(str == str2); //=> true
        System.out.println(str == str3); //=> true になるとは限らない。偶然同じオブジェクトを参照していれば true。
        System.out.println(str == null); //=> false
        // 値の比較
        System.out.println("abc".equals(str)); //=> true
        System.out.println("ABC".equals(str)); //=> false
        System.out.println("abc".equals(null)); //=> false
        System.out.println(str.equals("abc")); // str が null だと例外が発生して危険。"abc".equals(str) が安全。
        System.out.println("AAA".equalsIgnoreCase("aaA")); //=> true (文字列のみ)
        System.out.println((new Integer(0)).compareTo(-1)); //=> 1 (0 > -1)
        System.out.println((new Integer(0)).compareTo(0)); //=> 0 (0 == 0)
        System.out.println((new Integer(0)).compareTo(1)); //=> -1 (0 < 1)
    }
}
ラッパークラスと基本型の相互変換
import java.util.ArrayList;
class Main {
    public static void main(String args[]) {
        // 基本型
        boolean b = true;
        byte by = 127;
        char c = 65535;
        int i = 1;
        double d = 1.0;
        // 基本型 → ラッパークラス
        Boolean bb = new Boolean(b);
        Byte bby = new Byte(by);
        Character cc = new Character(c);
        Integer ii = new Integer(i);
        Double dd = new Double(d);
        ArrayList<Integer> iList = new ArrayList<>(); // 暗黙的な変換 (オートボクシング)
        iList.add(i);
        // ラッパークラス → 基本型
        bb.booleanValue();
        bby.byteValue();
        cc.charValue();
        ii.intValue();
        dd.doubleValue();
        int i2 = ii; // 暗黙的な変換 (アンボクシング)
    }
}
アップキャストとダウンキャスト
C++ のアップキャストとダウンキャストは Java では以下のようになります。
class Main {
    public static void main(String args[]) {
        String str = "abc";
        Object obj = str; // アップキャスト
        System.out.println(obj instanceof String); //=> true
        String str2 = (String)obj; // ダウンキャスト
    }
}
Optional (Java 8)
Scala の Option 型のようなものです。Java 8 で導入されました。
import java.util.Optional;
class Main {
    public static void main(String args[]) {
        // Optional の生成
        Optional<Integer> iOpt = Optional.of(123); // null を渡すと例外が発生
        Optional<Integer> iOpt2 = Optional.empty();
        Optional<Integer> iOpt3 = Optional.ofNullable(null); // 例外が発生しない
        Optional<Integer> iOpt4 = Optional.ofNullable(123);
        System.out.println(iOpt); //=> Optional[123]
        System.out.println(iOpt2); //=> Optional.empty
        System.out.println(iOpt3); //=> Optional.empty
        System.out.println(iOpt4); //=> Optional[123]
        // 空かどうかの確認
        if(iOpt.isPresent()) {
            System.out.println(iOpt.get());
        }
        iOpt.ifPresent(i -> {
            System.out.println(i);
        });
        // Optional からの値の取得
        iOpt.get(); // 空ならば例外 java.util.NoSuchElementException
        iOpt.orElse(999); // 空ならば既定値
        iOpt.orElseGet(() -> { // 空ならば既定値 (ラムダ版)
            return 999;
        });
        try {
            iOpt.orElseThrow(() -> new Exception("例外")); // 空ならば例外
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        // 操作
        Optional<Integer> iOpt5 = iOpt.filter(i -> i > 0);
        Optional<Integer> iOpt6 = iOpt.map(i -> i * -1);
        // 入れ子になる場合は flatMap が便利
        Optional<Optional<Integer>> iOpt7 = iOpt.map(i -> {
            return Optional.of(i);
        });
        Optional<Integer> iOpt8 = iOpt.flatMap(i -> {
            return Optional.of(i);
        });
    }
}
基本型のうち int, long, double については対応する Optional が用意されています。
import java.util.OptionalInt;
import java.util.OptionalLong;
import java.util.OptionalDouble;
class Main {
    public static void main(String args[]) {
        OptionalInt iOpt = OptionalInt.of(1);
        OptionalLong lOpt = OptionalLong.of(1L);
        OptionalDouble dOpt = OptionalDouble.of(1.0);
    }
}
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方 PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ... PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala) Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...









