|
|
Stringクラスを使った文字列処理 Stringクラスのメソッド |
H.Kamifuji . |
文字列に対して様々な処理を行うには標準クラスとして用意されているStringクラスを使います。ここではStringクラスを使った文字列の操作について簡単に確認します。 Stringクラスには様々なメソッドが用意されています。詳しくは「Stringクラス」にて解説していますがここではよく使われるメソッドをいくつかご紹介しておきます。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
整数の場合であればint型、文字であればchar型などJavaでは基本的な値を取り扱うためのデータ型が用意されています。ただ文字列を取り扱う為の基本データ型は用意されていません。その代わり標準クラスとしてStringクラスが用意されています。 Javaでプログラムを作成するにはクラスを自分で定義し、そのクラスからモノを作り処理をさせます。標準クラスは、効率良くプログラムを作成できるように予め定義されているクラスのことです。この標準クラスは自分で定義したクラスと同じように扱うことができます。 標準クラスは様々なものが用意されていますが、代表的なものがStringクラスです。Stringクラスは文字の集合である文字列を取り扱うためのクラスです。 クラスからオブジェクトを作成する自分で定義したクラスであっても標準クラスとして用意されたクラスであってもクラスはあくまでも設計図であり、クラスからオブジェクトというモノを作って初めて利用することができます。詳しくはクラスのページで解説を行いますがクラスからオブジェクトを作成するには次のように行います。クラス名 変数名; 変数名 = new クラス名(引数, 引数, ...);オブジェクトを作成するには配列の場合と同じくnew演算子を使います。作成されたオブジェクトは変数に代入されることになります。 クラスのオブジェクトが代入される変数の型名にはintなどの基本データ型以外にクラス名を指定することもできます。クラス名を指定して変数を宣言した場合には、その変数には指定したクラスから作成されたオブジェクトが代入されることになります。 例えばStringクラスの場合には次のようになります。 String name; name = new String();Stringクラスのオブジェクトを作成し変数「name」に代入しています。 このように標準クラスであっても基本データ型と同じように変数に代入したり取り出したりして利用することができます。では次のページから String クラスの具体的な使用方法を確認していきます。 |
では標準クラスの中でStringクラスのオブジェクトを作成し変数に代入する方法を確認していきます。 文字列は複数の文字を連続させて一つの固まりとして扱うものです。そして文字列は「文字列」で記載したとおり"abc"や"こんにちは"のようにダブルクォーテーション(")で囲んで表現することができます。これらは実はStringクラスのオブジェクトとして実現されているものです。 丁寧に書けば文字列として表現したい文字の集まりを指定してStringクラスのオブジェクトを作成しますが、これらを全てまとめて"文字列"と記述するだけで実現できるようになっています。次のコードを見てください。 String str; char data[] = {'文', '字', '列'}; str = new String(data);この記述の仕方は何種類か用意されているStringクラスのオブジェクトを作成する方法の一つです。まずStringクラスの変数を宣言しています。そして文字列を構成する文字を集めたchar型の配列を用意しStringクラスの引数として指定してStringクラスのオブジェクトを作成してから変数に代入して初期化しています。これは次のように記述した場合と同じです。 String str; str = "文字列";単に"文字列"などのように記述するだけでStringクラスのオブジェクトが作成されます。この記述方法が用意されているおかげで画面に文字列を表示したい場合などは、いちいちStringクラスのオブジェクトをnew演算子を使って作成しなくても複数の文字をダブルクォーテーション(")で囲むだけで済みます。 System.out.println("こんにちは");なお基本データ型の場合と同じように変数の宣言と初期化をまとめて次のように記述することができます。 String str = "文字列";通常はこの方法でStringクラスのオブジェクトを作成しておけば問題ありません。 参照型の変数基本データ型の値を変数に代入した時には変数そのものが値を格納する入れ物となっていました。また配列を変数に代入した時には入れ物は別の場所で用意され変数には入れ物の位置が格納されていました。(配列の参照型変数については「参照型の変数の考え方」を参照して下さい)。クラスのオブジェクトを変数に代入する場合は、配列の場合と同じく参照型の変数となります。よってStringクラスのオブジェクトを作成して変数に代入した場合は、まず入れ物が別に用意されてStringクラスのオブジェクトが格納され、変数には入れ物の位置が格納されます。 文字列は一文字の場合もありますし長い文字列の場合もあります。文字の数によって必要な入れ物の大きさは変わってくるはずですがStringクラスの変数には入れ物の位置だけが格納されているので文字列が何文字であっても同じように扱うことができます。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample2_1{ public static void main(String args[]){ String str = "こんにちは"; System.out.println(str); System.out.println("こんばんは"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String]$ java JSample2_1 こんにちは こんばんは [xxxxxxxx@dddddddddd String]$ |
基本データ型の値を変数に代入した時には変数そのものが値を格納する入れ物となっていました。また配列を変数に代入した時には入れ物は別の場所で用意され変数には入れ物の位置が格納されていました。(配列の参照型変数については「参照型の変数の考え方」を参照して下さい)。 クラスのオブジェクトを変数に代入する場合は、配列の場合と同じく参照型の変数となります。よってStringクラスのオブジェクトを作成して変数に代入した場合は、まず入れ物が別に用意されてStringクラスのオブジェクトが格納され、変数には入れ物の位置が格納されます。 文字列は一文字の場合もありますし長い文字列の場合もあります。文字の数によって必要な入れ物の大きさは変わってくるはずですがStringクラスの変数には入れ物の位置だけが格納されているので文字列が何文字であっても同じように扱うことができます。 String str1 = "abc"; String str2 = "おはようございます";なおこの別に用意された入れ物は一度作成すると中身を変更することができません。次の例を見て下さい。 String str; str = "abc"; str = "おはようございます";この場合、まず"abc"という3つの文字が格納される入れ物が用意され、その入れ物の位置が変数に格納されます。そして次の文で"おはようございます"という9つの文字が格納される入れ物が別に用意され、その新しい入れ物の場所が変数に格納されます。 この時、最初に作成された"abc"の3文字を格納するための入れ物は誰にも使われなくなるため自動的に処分されます。 また「文字列の連結」でも記載したとおり、文字列と文字列は「+」演算子によって連結することができますが、この場合も文字列と文字列をつなげた新しい文字列を別の入れ物を用意して格納しています。 String str; str = "abc"; str = str + "def";この場合、変数には最初"abc"が格納された入れ物の位置が格納されていますが、次の文に文字列"abc"と別の文字列"def"が連結された新しい文字列"abcdef"が別に用意された入れ物に格納されます。そしてその入れ物の位置が改めて変数に格納されます。その為、最終的に変数に格納された入れ物の位置は、"abc"の位置でも"def"の位置でもありません。 プログラムを作成する上ではあまり意識しなくてもいいことではありますが、次のページで解説する文字列の比較といった場合には重要になってきます。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample3_1{ public static void main(String args[]){ String str = "こんにちは。"; str = str + "加藤さん。"; System.out.println(str); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String]$ java JSample3_1 こんにちは。加藤さん。 [xxxxxxxx@dddddddddd String]$ |
変数に格納されている値がある整数に等しいかどうかは「==」演算子を使って次のようにすることで確認できました。 int num = 5; if (num == 5){ /* 等しい時の処理 */ }これに対して文字列が他の文字列と等しいかどうか調べる場合には注意が必要です。これはStringクラスの変数が参照型のためです。 次の例を試して下さい。 String str1 = "abc"; String str2 = "abc"; if (str1 == str2){ System.out.println("等しい"); }else{ System.out.println("等しくない"); }これを実際に試すと結果は「等しい」と出ます。これはたまたまです。"abc"という文字列をどこかの入れ物に入れてその位置を最初に変数「str1」に代入し、次に同じように"abc"という文字列を先ほどとは別の入れ物に入れてその位置を変数「str2」に代入するため、この二つの単に比較しても本来等しくならないはずですが、Javaではこのような時に1番目と2番目で同じ"abc"の位置を代入しているようです。(文字列は一度作成すると変更不可なのでこのようにしても問題はおきません)。 ではもう一つ例を試して下さい。 String str1 = "abc"; String str2 = "ab"; str2 = str2 + "c"; if (str1 == str2){ System.out.println("等しい"); }else{ System.out.println("等しくない"); }今度は「等しくない」と表示されます。どちらも同じ文字列である"abc"を表すStringクラスのオブジェクトですが、今度の場合は同じ文字列であっても「str2 = str2 + "c";」を実行した時に入れ物を別に作り文字列"abc"を格納した後でその入れ物の位置を変数に代入しています。よって変数「str1」と変数「str2」に代入された入れ物の位置は異なります。 文字列と文字列を比較する場合、「==」演算子を使うと同じ文字列でも等しいと判定されたり等しくないと判定されたりします。どういった時にどう判定されるのかはJavaの実装にも依存してしまいますのでオブジェクトの比較ではなく同じ文字列が格納さえているかどうか調べる時には「==」演算子は使わないで下さい。 equalsメソッドオブジェクトが同一なのかを調べるのではなく、オブジェクトに格納されている文字列が単に同じかどうか調べるにはStringクラスで用意されているequalsメソッドを使います。実際には次のように記述します。文字列オブジェクト1.equals(文字列オブジェクト1)この場合、文字列オブジェクト1が表す文字列と文字列オブジェクト2が表す文字列が同じであった場合にtrueとなります。よって文字列が他の文字列と同じ文字の並びとなっているかどうか調べるには次のように記述します。 String str1 = "abc"; String str2 = "ab"; str2 = str2 + "c"; if (str1.equals(str2)){ System.out.println("等しい"); }else{ System.out.println("等しくない"); }今度は変数「str1」と変数「str2」に代入されている入れ物の位置は異なりますが、入れ物に入っている文字列は同じですので「等しい」と表示されます。 今回はどちらも変数に代入したものを比較していますが、次のようにどちらかを文字列の値で記述しても結構です。 String str = "abc"; if (str.equals("abc")){ System.out.println("等しい"); } if ("abc".equals(str)){ System.out.println("等しい"); }では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample4_1{ public static void main(String args[]){ String str1 = "abc"; String str2 = "abc"; String str3 = "ab"; System.out.println("str1 = " + str1); System.out.println("str2 = " + str2); if (str1 == str2){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } str3 = str3 + "c"; System.out.println("str1 = " + str1); System.out.println("str3 = " + str3); if (str1 == str3){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } System.out.println("equalsメソッドで比較"); if (str1.equals(str3)){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String]$ java JSample4_1 str1 = abc str2 = abc 等しい str1 = abc str3 = abc 等しくない equalsメソッドで比較 等しい [xxxxxxxx@dddddddddd String]$ |
文字列は複数の文字が順に並んだものです。この文字列の中の指定の位置にある1文字を取得することができます。Stringクラスで用意されているcharAtメソッドを使います。 文字列.charAt(インデックス)インデックスには文字列に含まれる文字毎に順に割り当てられた番号です。次の例を見てください。 B L U E --------- 0 1 2 3インデックスは0から始まり順に1ずつ増えていきます。「BLUE」という文字列があった場合、0番目の文字は「B」であり1番目の文字は「L」です。そして最後の文字「E」はインデックスが3となります。 charAtメソッドにインデックスを指定すると対応する文字をchar型の値として取得できます。 例えば次のように記述します。 String str = "blue"; char c1 = str.charAt(0); char c2 = str.charAt(1); char c3 = str.charAt(2); char c4 = str.charAt(3);char型の変数c1からc4までにそれぞれ文字列に含まれる文字が1文字ずつ代入されます。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample5_1{ public static void main(String args[]){ String str = "腕時計"; char c1 = str.charAt(0); char c2 = str.charAt(1); char c3 = str.charAt(2); System.out.println(c1); System.out.println(c2); System.out.println(c3); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String]$ java JSample5_1 腕 時 計 [xxxxxxxx@dddddddddd String]$ |
文字列の長さを取得する方法を確認します。文字列の長さは文字の数になります。Stringクラスで用意されているlengthメソッドを使います。 文字列.length()文字列の長さをint型の値として取得することができます。なお配列の長さを知るには「配列.length」のように記述していましたが、この場合のlengthはjavaの文法の一つでした。文字列の長さを知るためのlengthはStringクラスで定義されているメソッドです。その為、「文字列.length」ではなく「文字列.length()」となります。 例えば次のように記述します。 String str = "分度器"; int n = str.length();文字列"分度器"の長さを取得し変数「n」に代入しています。この場合は3が代入されることになります。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample6_1{ public static void main(String args[]){ String str = "腕時計"; System.out.println("文字列の長さは" + str.length()); for (int i = 0; i < str.length(); i++){ char c = str.charAt(i); System.out.println(c); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String]$ java JSample6_1 文字列の長さは3 腕 時 計 [xxxxxxxx@dddddddddd String]$文字列の長さを取得し、繰り返し処理の条件式の中で繰り返し回数を決めるために使用しています。 |
|