第7回 文字列定数を表す String クラス |
※画像が大きすぎるときは,ブラウザの縮小を使って下さい(通常のWindows用Webブラウザの場合,コントロールキーを押しながら - キーを押すと縮小,コントロールキーを押しながら + キーを押すと拡大です)。
※文字列定数は,+演算子で結合できることを思い出そう。
※文字列定数と他のデータ値を+演算子で演算すると,データ値が文字列表現に変換された上で,文字列として結合されることを思い出そう。
※文字列の中に二重引用符(")を入れたい場合は,\" とする。
例:System.out.println( "\"情報大\"" ); // "情報大" というように二重引用符つきで表示される。
※文字列の中に改良文字を入れたい場合は,\n とする。
例:System.out.println( "東京\n情報大" ); // 東京 と 情報大 の間に改行が入る。
●String型オブジェクトの生成方法
・前述したように,String型オブジェクトは「コンストラクタの呼び出しをともなったnew演算子の呼び出し」を
しなくても,二重引用符で囲った文字列定数を書くだけで生成できるので,下図(2)の様な書き方ができる。
●String型の機能
・Stringクラスの主なコンストラクタとメソッドを下表に示す。なお,表のすべての コンストラクタやメソッドをおぼえる必要は無いが,赤いメソッド名のものは
便利でよく使われるので憶えておこう。
※右欄に掲載されている「文字数を返すlength( )」はメソッドであることに注意。配列の要素数を返す(擬似的な)フィールド length
と混同しないこと。
●Stringクラスの使用例
以下に,Stringクラスのオブジェクトを使用した例を示す。①で使用しているコンストラクタ,②および④〜⑦で使用しているメソッドを上の表で調べてみよう。
StringTest.java
【解説】
・①では,"HEL"という文字列を表すString型オブジェクト s1 を生成・初期化している。使用しているコンストラクタは上掲の表の2番目のコンストラクタ。
・②では,String型の concat( ) メソッドを使って文字列の結合を行っている。なお,concatは,concatenate (連結する)の短縮名。
まず, Strign型オブジェクト s1 のconcat( )メソッドを呼び出して実引数に文字列定数 "LO!" を渡すと,String型オブジェクト s1 のconcat( )メソッドは,
自分( s1 )の持っている文字列 "HEL" と実引数にあたえられた文字列 "LO!" を結合した "HELLO!" という文字列を持つ新しいString型オブジェクトを
生成して,その参照値を返す。ここでは,新たに生成されたString型オブジェクトへの参照値は, s2 に代入されている。 s1の持つ文字列内容は "HEL" の
ままなので注意すること。 上掲の表に「新しいStringオブジェクトを生成して返す」という説明がついているメソッドは,同様に,自オブジェクトとは別の新しい
String型オブジェクトを生成してその参照値を返すようになっている。
・③のように, String型オブジェクトの文字列内容を表示するには, System.out.println( ) メソッドに,そのまま String型オブジェクトを渡せば良い。
・④の charAt( ) メソッドは,文字列の中の特定の文字を戦闘から何文字目かを指定して返すメソッドである。先頭の文字は0番目の文字であることに注意。
・⑤の indexOf( ) メソッドは,文字列の中から文字を検索するメソッドである。
・⑥の equals( ) メソッドは,文字列内容が同じかどうかと調べるメソッドである(詳細は上掲の表を参照)。s2と文字列定数"HELLO!"を比較しているが,
s2の文字列内容も同じ"HELLO!"なので,equals( )メソッドは true を返す。
・⑦の compareTo( ) メソッドは,辞書順(辞書に掲載されている順番を基準に)文字列を比較するメソッドである(詳細は上掲の表を参照)。
・⑧の substring( ) メソッドは,String型の自オブジェクトが表す文字列の一部分を取り出すメソッドである(詳細は上掲の表を参照)。このメソッドも,新しい
String型オブジェクトを生成してその参照値を返す。 ⑦の例では, "EL" という文字列を表すString型オブジェクトが新たに生成されて返されている。
・⑨の split( ) メソッドは,文字列を実引数に渡された文字列を区切りとして分割する(詳細は上掲の表を参照)。
●オブジェクトの同一性・同値性
前項の List 5 (StringTest.java)-⑥では, equals( ) メソッドを使って文字列内容が同一内容かどうかを調べている。ここで,「equals( ) メソッドなんか
使わずに,文字列オブジェクトを == 演算子で比較すればいいんじゃないの?」と思った人もいるだろう。実は, == 演算子による比較と equals( ) メソッドに
よる比較は,以下の様に,意味がかなり違うのである。
・==演算子による比較:同一性の検査
オブジェクト本体への参照値が等しいかどうかを調べる。参照値が同じと言うことは,メモリ上の同じ位置にオブジェクト本体がある,つまり,比較した
オブジェクトは物理的に同一のオブジェクトであることを意味する。言い方を変えると,==演算子は比較した2つのオブジェクトが物理的に同一の
オブジェクトかどうかを調べる演算子,ということになる。
・String型の equals( )メソッドによる比較:同値性の検査
比較する2個のString型オブジェクトの文字列内容を比較して,文字列内容が同じなら true を返し,文字列内容が異なれば false を返す。たとえ,
比較する2個のString型オブジェクトが物理的に別々のオブジェクトであっても,文字列内容さえ同じなら true を返す。
この違いを端的に示す例を以下の示す。このように,「まったく同じモノ(オブジェクト)」(同一性)を確認する==演算子と,「同じ値を持つ」(同値性)を確認する
equals( )メソッドは,その働きの違いを意識して使い分ける必要がある。通常の文字列処理なら,equals( )メソッドを使う局面がほとんどだろう。
Equivalent.java
Javaも年々進化しており,1995年の登場からバージョンアップを繰り返してきている。
そして,Java7というバージョンから, switch文で文字列定数による分岐処理が可能になった。
使用例を以下に示す。
StringSwitch.java