Java : リテラルの表記方法いろいろ
リテラル(Literal)とは、数値や文字列の値をソースコード上に表記したものです。
普段使い慣れているものから、あれ、こんな表記もできるのか…というのもあるかもしれません。
そんなリテラルについて、本記事ではご紹介していきます。
概要
リテラルの仕様は、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を続けて表記します。 |
|
16進数表記。 | 先頭に 0x をつけます。 0xに続けて 0~9 a~f を続けます。 (x および a~f は大文字でもOKです) |
|
8進数表記。 | 先頭に 0 をつけます。 0に続けて 0~7 を続けます。 |
|
2進数表記。 | 先頭に 0b をつけます。 0bに続けて 0~1を続けます。 (b は大文字でもOKです) |
|
マイナス表記。 | 整数表記の先頭に - (マイナス記号) をつけます。 |
|
long型表記。 int型ではコンパイルエラーになる大きな整数も表記できます。 |
数値表記の最後に L をつけます。 小文字の l も使えますが、Java言語仕様では大文字の L を推奨しています。(整数の 1 と見分けにくいため) |
|
_ (アンダーバー) 表記。 整数をアンダーバーで区切ることにより、桁数が分かりやすくなります。アンダーバーをつけてもつけなくても値自体は変わりません。 |
整数を _ (アンダーバー) で区切ります。 |
|
浮動小数点
浮動小数点のリテラル表記は、通常、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を省略できます。 |
|
浮動小数点表記。(10進数) | 小数表記に e をつけて指数部を追加します。 【指数部】 0~9の文字を使います。 eに続けて + (プラス記号) か - (マイナス記号)をつけることができます。 省略すると + をつけたことと同じ意味になります。 |
|
浮動小数点表記。(16進数) | 先頭に 0x をつけます。 小数表記に続けて p をつけて指数部を追加します。 【整数部、小数部】 0~9, a~fの文字を使います。 【指数部】 0~9の文字を使います。(a~fは使えません) pに続けて + (プラス記号) か - (マイナス記号)をつけることができます。 省略すると + をつけたことと同じ意味になります。 【補足】 eの基数は10ですが、pの基数は2になります。 |
|
マイナス表記 | 先頭に - (マイナス記号) をつけます。 |
|
float型表記/double型表記 | 表記の最後に f をつけると float型になります。 d をつけると double型になります。 なにもつけないとdouble型です。 |
|
_ (アンダーバー) 表記。 浮動小数点をアンダーバーで区切ることにより、桁数が分かりやすくなります。アンダーバーをつけてもつけなくても値自体は変わりません。 |
浮動小数点を _ (アンダーバー) で区切ります。 |
|
厳密にはリテラルとは言わないのかもしれませんが、
- 正の無限大(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 型となります。
表記は true と false のみです。
final boolean b1 = true;
final boolean b2 = false;
// 0 や 1 を指定することはできません。
final boolean b3 = 0; // コンパイルエラー
文字
文字のリテラル表記は、常に char 型となります。
説明 | 記法 | コード例 |
---|---|---|
文字表記。 | ' (シングルクォート) で1文字をかこみます。 |
|
エスケープシーケンス表記。 通常文字として表記できない文字を表現できます。 |
\ (バックスラッシュ)とその後に特定の文字を続けます。 ※日本語の環境だと、バックスラッシュは¥と表示される場合もあります。 「エスケープシーケンスの基本」の記事もよろしければご参照ください。 |
|
ユニコードエスケープ表記。 ユニコード値で文字を表記できます。 |
\u に続けて16進数で4桁のユニコード値を指定します。 |
|
サロゲート・ペア
サロゲート・ペアの詳細は割愛しますが、簡単にいうと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個以上の文字かこみます。 |
|
エスケープシーケンス表記。 通常文字として表記できない文字を表現できます。 |
\ (バックスラッシュ)とその後に特定の文字を続けます。 ※日本語の環境だと、バックスラッシュは¥と表示される場合もあります。 「エスケープシーケンスの基本」の記事もよろしければご参照ください。 |
|
ユニコードエスケープ表記。 ユニコード値で文字を表記できます。 |
\u に続けて16進数で4桁のユニコード値を指定します。 |
|
テキストブロック
テキストブロックのリテラル表記は、常に 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; // コンパイルエラー