広告

Java : リテラルの表記方法いろいろ

リテラル(Literal)とは、数値や文字列の値をソースコード上に表記したものです。
普段使い慣れているものから、あれ、こんな表記もできるのか…というのもあるかもしれません。

そんなリテラルについて、本記事ではご紹介していきます。


概要

3.10. Literals
A literal is the source code representation of a value of a primitive type (§4.2), the String type (§4.3.3), or the null type (§4.1).

リテラルの仕様は、Java 言語仕様によって定義されています。
数値や文字列の値を、ソースコード上に直接表記したいときに使います。

言葉にすると難しく聞こえますが、例を見ると分かりやすいかと思います。

final int a = 1234;
final String b = "abcd";

上記の例だと

  • 1234 : 整数のリテラル表記
  • "abcd" : 文字列のリテラル表記

です。

それでは、1つずつリテラル表記を見ていきましょう。

リテラル表記

整数

整数のリテラル表記は、通常、int 型となります。
末尾に L がつくと long 型となります。

final int dec1 = 1234;
final long dec2 = 1234567890123456789L;
説明 記法 コード例
10進数表記。

整数の最も基本となる表記です。
1つ以上の0~9を続けて表記します。
final int dec1 = 0;
final int dec2 = 1234;

// intの範囲外はコンパイルエラーとなります。
final int max1 = 2147483647; // intの最大値 : OK
final int max2 = 2147483648; // コンパイルエラー

// long型表記を使うと、より大きな値も表記できます。
final long max3 = 1234567890123456789L;
16進数表記。 先頭に 0x をつけます。
0xに続けて 0~9 a~f を続けます。
(x および a~f は大文字でもOKです)
final int hex1 = 0x9;
System.out.println(hex1); // 9

final int hex2 = 0xa;
System.out.println(hex2); // 10

final int hex3 = 0xf;
System.out.println(hex3); // 15

final int hex4 = 0x10;
System.out.println(hex4); // 16

final int hex5 = 0x1234abcd;
System.out.println(hex5); // 305441741
8進数表記。 先頭に 0 をつけます。
0に続けて 0~7 を続けます。
final int oct1 = 07;
System.out.println(oct1); // 7

final int oct2 = 010;
System.out.println(oct2); // 8

final int oct3 = 01234;
System.out.println(oct3); // 688
2進数表記。 先頭に 0b をつけます。
0bに続けて 0~1を続けます。
(b は大文字でもOKです)
final int bin1 = 0b1111;
System.out.println(bin1); // 15
System.out.println(Integer.toHexString(bin1)); // f

final int bin2 = 0b1111000011110000;
System.out.println(bin2); // 61680
System.out.println(Integer.toHexString(bin2)); // f0f0
マイナス表記。 整数表記の先頭に - (マイナス記号) をつけます。
final int dec = -1234;
final int hex = -0x12ab;
final int oct = -01234;
final int bin = -0b00110011;
long型表記。

int型ではコンパイルエラーになる大きな整数も表記できます。
数値表記の最後に L をつけます。

小文字の l も使えますが、Java言語仕様では大文字の L を推奨しています。(整数の 1 と見分けにくいため)
final long dec = 1234567890123456789L;
final long hex = 0x123456789abcdefL;
final long oct = 012345671234567L;
final long bin = 0b1111000011110000111100001111000011110000L;
_ (アンダーバー) 表記。

整数をアンダーバーで区切ることにより、桁数が分かりやすくなります。アンダーバーをつけてもつけなくても値自体は変わりません。
整数を _ (アンダーバー) で区切ります。
final int dec = 1234_5678;
final int hex = 0x1234_abcd;
final int oct = 01234_7777;
final int bin = 0b1111_0000_1111_0000;

浮動小数点

浮動小数点のリテラル表記は、通常、double 型となります。
末尾に f がつくと float 型となります。

final double dec1 = 1.234;
final float dec2 = 1.234f;

// 範囲外はコンパイルエラーとなります。(floatの例です)
final float max1 = 3.4028235e38f; // floatの最大値 : OK
final float max2 = 3.4028236e38f; // コンパイルエラー

// doubleでは、より大きな値を表記できます。
final double max3 = 1.7976931348623157e308;
説明 記法 コード例
小数表記。(10進数)

※16進数の小数表記(指数なし)はできません。
整数部と小数部を . (ピリオド)で区切ります。

整数部、小数部には0~9の文字を使います。

整数部が0の場合は、0を省略できます。
小数部が0の場合は、0を省略できます。
final double dec1 = 1234.5678;

final double dec2 = 0.1234;
final double dec3 = .1234; // dec2と同じです。

final double dec4 = 123.0;
final double dec5 = 123.; // dec4と同じです。
浮動小数点表記。(10進数) 小数表記に e をつけて指数部を追加します。

【指数部】
0~9の文字を使います。

eに続けて + (プラス記号) か - (マイナス記号)をつけることができます。
省略すると + をつけたことと同じ意味になります。
final double dec1 = 1.23e3;
final double dec2 = 1.23e+3; // dec1 と同じです。
final double dec3 = 1.23e-3;

System.out.println(dec1); // 1230.0
System.out.println(dec2); // 1230.0
System.out.println(dec3); // 0.00123

final double dec4 = 456e10;
final double dec5 = .456e-10;

System.out.println(dec4); // 4.56E12
System.out.println(dec5); // 4.56E-11
浮動小数点表記。(16進数) 先頭に 0x をつけます。
小数表記に続けて p をつけて指数部を追加します。

【整数部、小数部】
0~9, a~fの文字を使います。

【指数部】
0~9の文字を使います。(a~fは使えません)

pに続けて + (プラス記号) か - (マイナス記号)をつけることができます。
省略すると + をつけたことと同じ意味になります。

【補足】
eの基数は10ですが、pの基数は2になります。
final double hex1 = 0x10p1;
final double hex2 = 0x10p+1; // hex1 と同じです。
final double hex3 = 0x10p-1;

System.out.println(hex1); // 32.0
System.out.println(hex2); // 32.0
System.out.println(hex3); // 8.0

final double hex4 = 0x0.123p4;
final double hex5 = 0x.123p-4; // hex4 と同じです。

System.out.println(Double.toHexString(hex4)); // 0x1.23p0
System.out.println(Double.toHexString(hex5)); // 0x1.23p-8

final double hex6 = 0x12ab.ef34p8;
System.out.println(Double.toHexString(hex6)); // 0x1.2abef34p20
マイナス表記 先頭に - (マイナス記号) をつけます。
final double dex1 = -123.456;
final double dex2 = -.123;
final double dex3 = -123.456e10;

final double hex1 = -0x1.ab23p8;
float型表記/double型表記 表記の最後に f をつけると float型になります。
d をつけると double型になります。

なにもつけないとdouble型です。
final double dec1 = 123.456;
final double dec2 = 123.456d; // dec1 と同じです。

final float dec3 = 123.456f;
_ (アンダーバー) 表記。

浮動小数点をアンダーバーで区切ることにより、桁数が分かりやすくなります。アンダーバーをつけてもつけなくても値自体は変わりません。
浮動小数点を _ (アンダーバー) で区切ります。
final double dec1 = 1234_5678.0000_1234_5678;

厳密にはリテラルとは言わないのかもしれませんが、

  • 正の無限大(positive infinity)
  • 負の無限大(negative infinity)
  • 非数(NaN = not a number)

もあります。
それぞれ、FloatクラスとDoubleクラスの定数として定義されています。

// floatの例です。
final float pi = Float.POSITIVE_INFINITY;
final float ni = Float.NEGATIVE_INFINITY;
final float nan = Float.NaN;

System.out.println(pi); // Infinity
System.out.println(ni); // -Infinity
System.out.println(nan); // NaN

真偽

真偽のリテラル表記は、常に boolean 型となります。
表記は truefalse のみです。

final boolean b1 = true;
final boolean b2 = false;

// 0 や 1 を指定することはできません。
final boolean b3 = 0; // コンパイルエラー

文字

文字のリテラル表記は、常に char 型となります。

説明 記法 コード例
文字表記。 ' (シングルクォート) で1文字をかこみます。
final char c1 = 'a';
final char c2 = '+'; // 記号もOK
final char c3 = 'あ'; // 全角文字もOK
エスケープシーケンス表記。

通常文字として表記できない文字を表現できます。
(バックスラッシュ)とその後に特定の文字を続けます。

※日本語の環境だと、バックスラッシュは¥と表示される場合もあります。

エスケープシーケンスの基本」の記事もよろしければご参照ください。
final char c1 = '\''; // シングルクォート自体を表記
final char c2 = '\\'; // バックスラッシュ自体を表記
final char c3 = '\t'; // タブ
final char c4 = '\n'; // 改行(LF)
ユニコードエスケープ表記。

ユニコード値で文字を表記できます。
\u に続けて16進数で4桁のユニコード値を指定します。
// 'あ'のユニコード値を直接指定。
final char c = '\u3042';
System.out.println(c); // あ

サロゲート・ペア

サロゲートペア(代用対)は16ビットUnicodeの領域1024文字分を2つ使い(前半 U+D800 〜 U+DBFF、後半 U+DC00 〜 U+DFFF)、各々1個ずつからなるペアで1024 × 1024 = 1,048,576文字を表す。

サロゲート・ペアの詳細は割愛しますが、簡単にいうと1つの文字を32ビットで表現します。
ちなみに、Javaのchar型は16ビットです。…入りませんね。

例えば "𩸽" という1文字は、Unicodeでは\uD867\uDE3Dで表現します。
つまり、charが2つ必要となります。

このような文字は、文字としてのリテラル表記はできません。

// 文字列で表現。出力すると "𩸽" という1文字になります。
final String s = "\uD867\uDE3D";
System.out.println(s); // 𩸽

// 文字のリテラルとしては表記できません。
final char c = '\uD867\uDE3D'; // コンパイルエラー

サロゲート・ペアとなる常用文字は少ないとは思いますが、ご留意ください。

文字列

文字列のリテラル表記は、常に String 型となります。

説明 記法 コード例
文字列表記。 " (ダブルクォート) で0個以上の文字かこみます。
final String s1 = "abcd";
System.out.println(s1); // abcd

// 全角文字もOK
final String s2 = "あいうえお";
System.out.println(s2); // あいうえお
エスケープシーケンス表記。

通常文字として表記できない文字を表現できます。
(バックスラッシュ)とその後に特定の文字を続けます。

※日本語の環境だと、バックスラッシュは¥と表示される場合もあります。

エスケープシーケンスの基本」の記事もよろしければご参照ください。
final String s1 = "\""; // ダブルクォート自体を表記
final String s2 = "\\"; // バックスラッシュ自体を表記
final String s3 = "\t"; // タブ
final String s4 = "\n"; // 改行
ユニコードエスケープ表記。

ユニコード値で文字を表記できます。
\u に続けて16進数で4桁のユニコード値を指定します。
// 'あ'のユニコード値を直接指定。
final String s1 = "\u3042いうえお";
System.out.println(s1); // あいうえお

// ユニコードエスケープを使えば、サロゲート・ペアもOK
final var s2 = "\uD867\uDE3D";
System.out.println(s2); // 𩸽

テキストブロック

テキストブロックのリテラル表記は、常に String 型となります。

エスケープシーケンスを使わずに複数行を表現できたりと、文字列のリテラル表記を拡張したものです。
Java 15から言語仕様に追加されました。

テキストブロックは

  • 開始 : """ (ダブルクォート3つ) + 改行
  • 終了 : """ (ダブルクォート3つ)

で表記します。

// 通常の文字列リテラル
final String str = "<root>\n" +
        "    <child attr=\"abc\"/>\n" +
        "    <child attr=\"xyz\"/>\n" +
        "</root>\n";


// テキストブロック
final String textBlock = """
        <root>
            <child attr="abc"/>
            <child attr="xyz"/>
        </root>
        """;

// 内容は一致します。
System.out.println(str.equals(textBlock)); // true

テキストブロックについては

の記事でさらに解説していますので、そちらもご参照ください。

null

nullのリテラル表記は、null の1つだけです。

Objectに対して代入できます。
プリミティブ型 (基本データ型)には代入できません。

// Object
final String s = null;
final Integer i = null;

// プリミティブ型
final long l = null; // コンパイルエラー

関連記事

ページの先頭へ