Stringの基本のコードトレース
Stringは文字列を扱う参照型です。文字の位置、部分文字列の範囲、数値との連結を区別して、コードがどの文字を出すかを一つずつ確かめます。例はJava 11のmain内で実行します。
この単元で学ぶこと
- Stringの宣言と空文字列を説明する
- 添字と部分文字列の範囲を求める
- 検索と連結の結果を追跡する
本文解説
文字列を変数で扱う String name="Mika";は文字列オブジェクトを参照する変数nameを宣言します。Stringは大文字で始まる型名、"Mika"は二重引用符で囲んだリテラルです。一文字を表すchar c='M';と区別します。System.out.print(name);はMikaを表示します。名前を文字列として持てば、長さや一部をプログラムで調べられます。
空と未参照の違い String a="";は長さ0の実在する文字列を参照します。a.length()は0です。String b=null;は文字列を参照しないので、b.length()を呼ぶとNullPointerExceptionになります。画面に何も見えない値でも、" "は空白一つなので長さ1です。入力の欠落、空欄、空白入りの値を混同しません。
添字は0から数える "CAT"の位置はCが0、Aが1、Tが2です。"CAT".charAt(1)はA、length()は3です。末尾の有効な添字はlength()-1なので、charAt(3)は範囲外です。Javaの長さと添字はUTF-16のchar単位であり、絵文字等が必ず1になるとは限りません。最初はASCIIで位置を確認します。
範囲の終点は含まない "ABCDE".substring(1,4)は位置1、2、3のBCDを返します。取り出す長さは4-1=3です。substring(2)なら位置2から末尾までのCDE。開始と終了が同じsubstring(2,2)は空文字列です。終了がlength()でも許されますが、charAt(length())は許されず、操作ごとの境界を区別します。
検索で位置を得る "banana".indexOf("na")は最初に一致する位置2です。見つからないindexOf("z")は-1を返します。-1は例外でも末尾の位置でもありません。検索結果をそのままsubstringへ渡す前に、見つかったかを確認します。contains("na")は位置ではなくtrue/falseを返すので、存在確認だけなら意図を表しやすくなります。
数値と文字列をつなぐ +は左から評価され、文字列が含まれる箇所から連結になります。1+2+"件"は3件、"件"+1+2は件12です。"件"+(1+2)なら括弧内を先に計算するので件3。文字列の数字"2"を連結しても数値の加算には変わりません。式を左から中間値と型で追えば、表示の取り違えを防げます。
結果を受け取って利用する String s="cat";s.replace('c','b');だけではsはcatのままです。String自体の内容は変更できず、置換後の値を使うにはs=s.replace('c','b');とします。返された値をprintへ直接渡してもbatを表示できます。メソッドを呼ぶことと、変数へ結果を代入することは別の操作です。
型と表示を見分ける "12".length()はintの2、"12".charAt(0)はcharの'1'、"12".substring(0,1)はStringの"1"です。表示が似ていても、後続の+等の動きが変わります。lengthは配列のフィールドと違いStringではlength()というメソッドです。String s="ab";System.out.print(s.length);はコンパイルできません。
図解
重要ポイント
- 有効なcharAt添字は0以上length()未満。
- substringの終了添字は含めない。
- indexOfの未検出は-1。
- +の左結合と括弧、途中の型を追う。
間違えやすい点
- 空文字列とnullは別物。
- Stringのlength()に括弧が必要。
- 置換メソッドの戻り値を捨てると元の変数は変わらない。
用語解説
- 添字
- 文字列内のchar単位の位置。先頭は0。
- 空文字列
- 長さ0のString。nullとは異なる。
- 部分文字列
- 元の文字列の指定範囲から得られる文字列。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringBuilder.html
- https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.10.5
- https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.21.3
確認問題の出題・採点や学習履歴の保存にはログインが必要です。