7.2 文字列と文字配列
7.2.1 String型
Java において、文字とは2バイトで構成される Unicode だと説明しました。つまり、実体は 2 バイトの整数であり、この整数が Unicode で定められた文字にマッピングされているのです。ならば、文字列とは連続した文字であり、文字型の配列だと考えることができないでしょうか。
実際に、C 言語では文字列とは文字型 char の配列だと教えられます。しかし、Java の場合は文字列と文字配列は異なるものであると定められています。Java から入門したならば問題ありませんが、C/C++ の経験がある場合は、この違いを知る必要があります。確かに文字列とは文字の配列であると考えられますが、Java の場合はこれに加えて文字数などの管理情報も含めて文字列と呼んでいるのです。それがすなわち String 型なのです。
これまで String 型のインスタンスを生成するのに文字列リテラルを使用してきました。Java 言語は文字列リテラルを暗黙的に String 型のクラス・インスタンス生成式に変換してくれていたのです。String クラスはコンストラクタを公開しているため、明示的に String クラスのクラス・インスタンス生成式を記述して文字列を生成することも可能です。String クラスのコンストラクタを用いれば char 型の配列などから文字列を生成することも可能になります。
コンストラクタ | 解説 |
---|---|
String() | 新しく生成された String オブジェクトを初期化して、空の文字シーケンスを表すようにします。 |
String(byte[] bytes) | プラットフォームのデフォルト文字セットを使用して、指定されたバイト配列を復号化することによって、新しい String を構築します。 |
String(byte[] bytes, int offset, int length) | プラットフォームのデフォルト文字セットを使用して、指定されたバイト部分配列を復号化することによって、新しい String を構築します。 |
String(byte[] bytes, int offset, int length, String charsetName) | 指定された文字セットを使用して、指定されたバイト部分配列を復号化することによって、新しい String を構築します。 |
String(byte[] bytes, String charsetName) | 指定された文字セットを使用して、指定されたバイト配列を復号化することによって、新しい String を構築します。 |
String(char[] value) | 新しい String を割り当てて、これが文字配列引数に現在含まれている文字シーケンスを表すようにします。 |
String(char[] value, int offset, int count) | 文字配列引数の部分配列からなる文字を含む新しい String を割り当てます。 |
String(String original) | 新しく生成された String オブジェクトを初期化して、引数と同じ文字シーケンスを表すようにします。 |
String(StringBuffer buffer) | StringBuffer 型の引数に現在含まれている文字列を持つ新しい文字列を構築します。 |
class Test { public static void main(String args[]) { char cKitty[] = new char[5]; cKitty[0] = 'K'; cKitty[1] = 'i'; cKitty[2] = cKitty[3] = 't'; cKitty[4] = 'y'; String strKitty = new String(cKitty); System.out.println(strKitty); } }
>java Test Kitty
コード1は、新しい文字列を char 型の配列から生成しています。char 型の配列 cKitty 変数の構成要素には、先頭から "Kitty" という文字を順に与えています。これを String コンストラクタに渡すことによって、文字列に変換することができるのです。
String クラスでは、文字列の変換や検索など、様々なサービスを提供しています。文字列から単一の文字を抽出したり、文字配列を取得したい場合は String クラスのメソッドを利用すると良いでしょう。表 07_02_01 に重要なメソッドを紹介します。String クラスが提供するメソッドの全容は、最新の「JavaTM 2 Platform, Standard Edition, API 仕様」を参照すると良いでしょう。
メソッド | 解説 |
---|---|
char charAt(int index) | 指定されたインデックス位置にある文字を返します。 |
boolean equals(Object anObject) | この文字列と指定されたオブジェクトを比較します。 |
String concat(String str) | 指定された文字列をこの文字列の最後に連結します。 |
int length() | この文字列の長さを返します。 |
String substring(int beginIndex) | この文字列の部分文字列である新しい文字列を返します。 |
String substring(int beginIndex, int endIndex) | この文字列の部分文字列である新しい文字列を返します。 |
char[] toCharArray() | この文字列を新しい文字配列に変換します。 |
String trim() | 文字列のコピーを返します。 |
これらのような String クラスのメソッドを用いれば、高度な文字列制御を実現することができるようになるでしょう。substring() メソッドを使えば文字列から一部分だけを抽出することができますし、equals() メソッドを用いれば、異なる文字列インスタンスが表す文字列が等しいかどうかを調べることができます。これらは、言語プロセッサやテキスト変換ソフトウェアの開発には欠かせない知識となります。
class Test { public static void main(String args[]) { String str = "Kitty"; for(int i = 0 ; i < str.length() ; i++) { System.out.println("str[" + i + "] = " + str.charAt(i)); } } }
>java Test str[0] = K str[1] = i str[2] = t str[3] = t str[4] = y
コード2では、str 文字列変数を for ループにかけて 1 文字ずつ配列のように表示するプログラムです。ループが文字数分だけ正しく繰る返されるように length() メソッドを用いて文字数を取得し、これを条件にしています。その後 charAt() メソッドを用いて文字列から目的の文字を取得しています。
因みに、文字列リテラルは暗黙的にインスタンス化されるため、次のような文も誤りではありません。
char ary[] = "Kitty on your lap" . toCharArray();
このような記述が必要になることはあまりありませんが、Java プログラマはこの記述が正しいことを証明できる必要があります。C 言語と異なり、文字列は暗黙的に String 型のインスタンスであること常に意識してください。