第6回 文字列定数を表す String クラス

※画像が大きすぎるときは,ブラウザの縮小を使って下さい(通常のWindows用Webブラウザの場合,コントロールキーを押しながら - キーを押すと縮小,コントロールキーを押しながら + キーを押すと拡大です)。

●文字列定数クラスString

・Javaには,文字列定数を表す便利なクラス String が用意されている。実は, Java のプログラムで
 "こんにちは" などとかかれている文字列定数の正体は, このString型のオブジェクト(への参照値)
 なのである。 プログラムの中で "こんにちは" という文字列定数を書いておくと,プログラムが動作する
 ときに,同じ内容の文字列を表すString型オブジェクトが自動で生成され, ソースプログラム上で
 "こんにちは" と書かれた部分はそのString型のオブジェクト(への参照値)として扱われているので
 ある(下図参照)


そのため,メソッドのString型仮引数には,String型オブジェクトはもちろん,二重引用符で囲んだ文字列
定数を渡すことができる
(下図参照)。

StringArgs.java


ところで,オブジェクトのメンバを指定するには,通常,下図(1)のように「オブジェクト名.メンバ名」と書くが,これは正確には
下図(2)のように,「オブジェクト本体への参照値を格納する変数の名前.メンバ名」である。さらに厳密に言うと,下図(3)の
ように,「オブジェクト本体への参照値.メンバ」となる。この形の使用例は,下図右下欄の「(3)の書き方の例」を見よ。
特に,最後の
     s.concat( "大学" ).length( )
のように,「オブジェクトへの参照値を返すメソッド」の呼び出しの後ろに直接「.メンバ名」をつける書き方はよく使われる。

Person.java

 


●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




● swich文でString型を使う


 Javaも年々進化しており,1995年の登場からバージョンアップを繰り返してきている。
そして,Java7というバージョンから, switch文で文字列定数による分岐処理が可能になった。



使用例を以下に示す。

StringSwitch.java