「3.10.5. 文字列リテラル」の編集履歴(バックアップ)一覧はこちら
「3.10.5. 文字列リテラル」(2012/09/10 (月) 08:01:51) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*[[3. 字句構造]]
**[[3.1. Unicode]]
**[[3.2. 字句変換]]
**[[3.3. Unicodeエスケープ]]
**[[3.4. 行終端子]]
**[[3.5. 入力要素とトークン]]
**[[3.6. 空白]]
**[[3.7. コメント]]
**[[3.8. 識別子]]
**[[3.9. キーワード]]
**[[3.10. リテラル]]
***[[3.10.1. 整数リテラル]]
***[[3.10.2. 浮動小数点リテラル]]
***[[3.10.3. ブールリテラル]]
***[[3.10.4. 文字リテラル]]
***3.10.5. 文字列リテラル
&i(){文字列リテラル(string literal)}は2重引用符で0個以上の文字を括ったものです。文字は[[エスケープシーケンス>3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]でも構いません。U+0000~U+FFFFの範囲にある文字に対しては1つのエスケープシーケンスで、U+010000~U+10FFFFの範囲にある文字に対してはUTF-16サロゲートコード単位を表す2つのエスケープシーケンスで表せます。
#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){
&i(){StringLiteral}:
&tt(){"} &i(){StringCharacters&sub(){opt}} &tt(){"}
&i(){StringCharacters}:
&i(){StringCharacter}
&i(){StringCharacters} &i(){StringCharacter}
&i(){StringCharacter}:
&i(){InputCharacter} but not &tt(){"} or &tt(){\}
&i(){EscapeSequence}
}
&i(){&small(){エスケープシーケンスの定義については[[3.10.6.>3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]を参照してください。}}
文字列リテラルは常に[[String型>4.3.3. Stringクラス]]です。
&bold(){始まりの&tt(){"}の後、終わりの対になる&tt(){"}の間に行終端子が入るとコンパイルエラーとなります。}
&i(){&small(){[[3.4.>3.4. 行終端子]]で明記した通り、文字CRとLFは決して&i(){InputCharacter}とはなりません。それらは LineTerminator を構成するものとして認識されます。}}
&i(){&small(){長い文字列リテラルを短い部分文字列に分解して[[文字列連結演算子+>15.18.1. 文字列連結演算子+]]を使用した(おそらく括弧で括られた)式として書くことができます。}}
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){
&i(){&small(){以下は文字列リテラルの例です。:}}
"" // 空文字列
"\"" // "のみの文字列
"This is a string" // 16文字の文字列
"This is a " + // 実際には文字列値の定数式、
"two-line string" // 2つの文字列リテラルから構成されています
}
&i(){&small(){Unicodeエスケープはごく初期に処理されるため、ラインフィード(LF)の値をとる文字リテラルとしての&tt(){"\u000a"}という書き方は正しくありません。Unicodeエスケープ&tt(){"\u000a"}は[[変換ステップ1>3.3. Unicodeエスケープ]]において実際のラインフィードに変換され、[[ステップ2>3.4. 行終端子]]においてラインフィードは&i(){LineTerminator}となるため、ステップ3においてその文字リテラルは有効ではりません。代わりに、[[エスケープシーケンス>3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]&tt(){"\n"}を使用します。同様にキャリッジリターン(CR)の値をとる文字リテラルとしての&tt(){"\u000d"}という書き方は正しくありません。代わりに&tt(){"\r"}を使用してください。最後に、2重引用符(&tt(){"})を含む文字列リテラルで&tt(){"\u0022"}と書くことはできません。}}
文字列リテラルは&tt(){String}クラスのインスタンスへの参照です([[4.3.1.>4.3.1. オブジェクト]]、[[4.3.3.>4.3.3. Stringクラス]])。
さらに、文字列リテラルは常に&tt(){String}クラスの同じインスタンスを参照しています。文字列リテラル、より一般的に[[定数式>15.28. 定数式]]の値である文字列、はメソッド&tt(){String.intern}を使って一意のインスタンスを共有するために"抑留(intern)”されます。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){
&bold(){&aname(ex3.10.5-1){例3.10.5-1. 文字列リテラル}}
&i(){&small(){以下の[[コンパイル単位>7.3. コンパイル単位]]:}}
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
&i(){&small(){と以下のコンパイル単位:}}
package other;
public class Other { public static String hello = "Hello"; }
&i(){&small(){で構成されるプログラムから以下の出力が得られます。:}}
true true true true false true
&i(){&small(){この例で以下の6点を解説します。}}
-&i(){&small(){同一[[パッケージ>7. パッケージ]]内の同一[[クラス>8. クラス]]内の文字列リテラルは同一の&tt(){String}[[オブジェクト>4.3.1. オブジェクト]]への参照として表されます。}}
-&i(){&small(){同一パッケージ内の異なるクラス内の文字列リテラルは同一の&tt(){String}オブジェクトへの参照として表されます。}}
-&i(){&small(){異なるパッケージ内の異なるクラス内の文字列リテラルも同様に同一の&tt(){String}オブジェクトへの参照として表されます。}}
-&i(){&small(){[[定数式>15.28. 定数式]]によって計算される文字列はコンパイル時に計算されリテラルと同じように扱われます。}}
-&i(){&small(){実行時に連結により計算される文字列は新規に作成されるので異なるものとなります。}}
-&i(){&small(){計算される文字列を明示的に抑留すると、同一の内容である既存の文字列と同じ文字列となります。}}
}
***[[3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]
***[[3.10.7. ヌルリテラル]]
**[[3.11. 分離子]]
**[[3.12. 演算子]]
*[[3. 字句構造]]
**[[3.1. Unicode]]
**[[3.2. 字句変換]]
**[[3.3. Unicodeエスケープ]]
**[[3.4. 行終端子]]
**[[3.5. 入力要素とトークン]]
**[[3.6. 空白]]
**[[3.7. コメント]]
**[[3.8. 識別子]]
**[[3.9. キーワード]]
**[[3.10. リテラル]]
***[[3.10.1. 整数リテラル]]
***[[3.10.2. 浮動小数点リテラル]]
***[[3.10.3. ブールリテラル]]
***[[3.10.4. 文字リテラル]]
***3.10.5. 文字列リテラル
&i(){文字列リテラル(string literal)}は2重引用符で0個以上の文字を括ったものです。文字は[[エスケープシーケンス>3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]でも構いません。U+0000~U+FFFFの範囲にある文字に対しては1つのエスケープシーケンスで、U+010000~U+10FFFFの範囲にある文字に対してはUTF-16サロゲートコード単位を表す2つのエスケープシーケンスで表せます。
#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){
&i(){StringLiteral}:
&tt(){"} &i(){StringCharacters&sub(){opt}} &tt(){"}
&i(){StringCharacters}:
&i(){StringCharacter}
&i(){StringCharacters} &i(){StringCharacter}
&i(){StringCharacter}:
&i(){InputCharacter} but not &tt(){"} or &tt(){\}
&i(){EscapeSequence}
}
&i(){&small(){エスケープシーケンスの定義については[[3.10.6.>3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]を参照してください。}}
文字列リテラルは常に[[String型>4.3.3. Stringクラス]]です。
&bold(){始まりの&tt(){"}の後、終わりの対になる&tt(){"}の間に行終端子が入るとコンパイルエラーとなります。}
&i(){&small(){[[3.4.>3.4. 行終端子]]で明記した通り、文字CRとLFは決して&i(){InputCharacter}とはなりません。それらは LineTerminator を構成するものとして認識されます。}}
&i(){&small(){長い文字列リテラルを短い部分文字列に分解して[[文字列連結演算子+>15.18.1. 文字列連結演算子+]]を使用した(おそらく括弧で括られた)式として書くことができます。}}
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){
&i(){&small(){以下は文字列リテラルの例です。:}}
"" // 空文字列
"\"" // "のみの文字列
"This is a string" // 16文字の文字列
"This is a " + // 実際には文字列値の定数式、
"two-line string" // 2つの文字列リテラルから構成されています
}
&i(){&small(){Unicodeエスケープはごく初期に処理されるため、ラインフィード(LF)の値をとる文字リテラルとしての&tt(){"\u000a"}という書き方は正しくありません。Unicodeエスケープ&tt(){"\u000a"}は[[変換ステップ1>3.3. Unicodeエスケープ]]において実際のラインフィードに変換され、[[ステップ2>3.4. 行終端子]]においてラインフィードは&i(){LineTerminator}となるため、ステップ3においてその文字リテラルは有効ではりません。代わりに、[[エスケープシーケンス>3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]&tt(){"\n"}を使用します。同様にキャリッジリターン(CR)の値をとる文字リテラルとしての&tt(){"\u000d"}という書き方は正しくありません。代わりに&tt(){"\r"}を使用してください。最後に、2重引用符(&tt(){"})を含む文字列リテラルで&tt(){"\u0022"}と書くことはできません。}}
文字列リテラルは&tt(){String}クラスのインスタンスへの参照です([[4.3.1.>4.3.1. オブジェクト]]、[[4.3.3.>4.3.3. Stringクラス]])。
さらに、文字列リテラルは常に&tt(){String}クラスの同じインスタンスを参照しています。文字列リテラル、より一般的に[[定数式>15.28. 定数式]]の値である文字列、はメソッド&tt(){String.intern}を使って一意のインスタンスを共有するために"抑留(intern)”されます。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){
&bold(){&aname(ex3.10.5-1,option=nolink){例3.10.5-1. 文字列リテラル}}
&i(){&small(){以下の[[コンパイル単位>7.3. コンパイル単位]]:}}
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
&i(){&small(){と以下のコンパイル単位:}}
package other;
public class Other { public static String hello = "Hello"; }
&i(){&small(){で構成されるプログラムから以下の出力が得られます。:}}
true true true true false true
&i(){&small(){この例で以下の6点を解説します。}}
-&i(){&small(){同一[[パッケージ>7. パッケージ]]内の同一[[クラス>8. クラス]]内の文字列リテラルは同一の&tt(){String}[[オブジェクト>4.3.1. オブジェクト]]への参照として表されます。}}
-&i(){&small(){同一パッケージ内の異なるクラス内の文字列リテラルは同一の&tt(){String}オブジェクトへの参照として表されます。}}
-&i(){&small(){異なるパッケージ内の異なるクラス内の文字列リテラルも同様に同一の&tt(){String}オブジェクトへの参照として表されます。}}
-&i(){&small(){[[定数式>15.28. 定数式]]によって計算される文字列はコンパイル時に計算されリテラルと同じように扱われます。}}
-&i(){&small(){実行時に連結により計算される文字列は新規に作成されるので異なるものとなります。}}
-&i(){&small(){計算される文字列を明示的に抑留すると、同一の内容である既存の文字列と同じ文字列となります。}}
}
***[[3.10.6. 文字・文字列リテラル用のエスケープシーケンス]]
***[[3.10.7. ヌルリテラル]]
**[[3.11. 分離子]]
**[[3.12. 演算子]]
表示オプション
横に並べて表示:
変化行の前後のみ表示: