6日でできる 新Java入門|Stringクラス② メソッド

文字列の技を使いこなせるようになると、Javaの表現力は一気に広がる。Stringクラスのメソッドを学んで、文字操作の修行を次の段階へ進めよう

Stringクラスは、Javaで文字列を扱うときの中心になるクラスです。前回は、Stringクラスが フィールド、メソッド、コンストラクタ を持つクラスであることを見てきました。今回はその中でも、とくに実戦でよく使う メソッド に注目していきます。文字列を切り分ける、目的の位置を探す、ほかの文字列とつなげる、同じ内容かを比べる、大文字と小文字を変換する、前後の空白を整える、といった操作は、Stringクラスのメソッドを使うことでとても分かりやすく書けます。

ドラゴンボールの世界でたとえるなら、Stringクラスは文字列を扱うための サイヤ人の修行書 のようなものです。そして、indexOf や substring や equals などのメソッドは、その修行書に書かれた技です。ただ文字列を持っているだけではなく、必要に応じて切り出したり、比べたり、形を変えたりできるところが大きな強みです。文字列を扱う力が上がると、プログラム全体の表現力もかなり上がっていきます。

この記事では、Stringクラスの代表的なメソッドを、ひとつずつ丁寧に見ていきます。Lesson15_1.java と Lesson15_2.java では indexOf と substring を使った分割、Lesson15_3.java では concat、Lesson15_4.java では length、Lesson15_5.java では equals、Lesson15_6.java では toUpperCase と toLowerCase、Lesson15_7.java では trim を扱います。文字列をただ表示する段階から、文字列を加工して活用する段階へ進む、大事な修行です。

Stringクラスのメソッドとは何か

メソッドとは、クラスが持っている操作手段です。Stringクラスの場合は、文字列に対して使える便利な技があらかじめたくさん用意されています。

ドラゴンボール風にいえば、Stringクラスはサイヤ人の修行書であり、その中に 文字列検索の技、文字列切り出しの技、比較の技、連結の技、変換の技 がそろっているようなものです。必要な場面でその技を呼び出せば、複雑な処理を短く安全に書けます。

代表的なStringメソッド

メソッド機能戻り値
concat(String str)末尾に文字列を連結Stringstr.concat("追加")
equals(String str)内容が等しいか比較booleanstr.equals("テスト")
indexOf(String str)指定文字列の最初の位置を返すintstr.indexOf("a")
length()文字数を返すintstr.length()
substring(int, int)指定範囲の部分文字列を取得Stringstr.substring(2, 5)
toLowerCase()小文字に変換Stringstr.toLowerCase()
toUpperCase()大文字に変換Stringstr.toUpperCase()
trim()前後の空白を除去Stringstr.trim()

この表を見ると、Stringクラスは 文字列に対していろいろな技を使えるクラス だということがよく分かります。

文字列を区切り文字で分割する

まずは、indexOf() と substring() を組み合わせて、ひとつの文字列を分割する方法を見ていきます。区切り文字の位置を探して、その前後を切り出す流れです。

ドラゴンボール風にたとえるなら、ひとつの修行記録の巻物に 修行名,修行場所 と書かれていて、そのカンマを目印に左側と右側を分けるようなイメージです。区切り位置が分かれば、必要な情報を別々に取り出せます。

ファイル名:Lesson15_1.java

public class Lesson15_1 {
    public static void main(String[] args) {
        String line = "かめはめ波,亀仙人の修行場";
        int idx = line.indexOf(','); // カンマの位置を取得

        String technique = line.substring(0, idx);   // 左側
        String place = line.substring(idx + 1);      // 右側

        System.out.println("技名: " + technique);
        System.out.println("修行場所: " + place);
    }
}

実行結果

技名: かめはめ波
修行場所: 亀仙人の修行場

このプログラムでは、line に かめはめ波,亀仙人の修行場 という文字列を入れています。indexOf(',') によって、カンマの位置を数値として取得し、その位置を使って substring で左右を分けています。

処理の流れ

手順内容
1line に 文字列全体を入れる
2indexOf(',') で区切り位置を探す
3substring(0, idx) で左側を取り出す
4substring(idx + 1) で右側を取り出す
5それぞれを表示する

インデックスの対応表

文字列0123456789101112
line,

この場合、idx は 5 です。そこを境にして左側が技名、右側が修行場所になります。

この処理で大切なこと

メソッド役割
indexOf(',')カンマの位置を返す
substring(0, idx)最初からカンマ直前までを取り出す
substring(idx + 1)カンマの次から最後までを取り出す

ここで大事なのは、substring の第2引数は その位置の手前まで を意味することです。つまり、substring(0, idx) なら 0 から idx-1 までが取り出されます。

複数の区切り文字がある場合

区切り文字が1つだけとは限りません。複数のカンマがある場合には、indexOf の第2引数付きの形を使うと、次の位置を探せます。

ドラゴンボール風に言えば、ひとつの記録に 国,都市,地方 のように複数の情報が並んでいるとき、1つ目の目印だけでなく、2つ目の目印も見つけて3つに分ける流れです。

ファイル名:Lesson15_2.java

public class Lesson15_2 {
    public static void main(String[] args) {
        String data = "サイヤ人,ベジータ,修行場A";
        int firstComma = data.indexOf(',');
        int secondComma = data.indexOf(',', firstComma + 1);

        String warriorType = data.substring(0, firstComma);
        String warriorName = data.substring(firstComma + 1, secondComma);
        String trainingPlace = data.substring(secondComma + 1);

        System.out.println("種別: " + warriorType);
        System.out.println("名前: " + warriorName);
        System.out.println("修行場所: " + trainingPlace);
    }
}

実行結果

種別: サイヤ人
名前: ベジータ
修行場所: 修行場A

このプログラムでは、最初のカンマの位置を firstComma、2つ目のカンマの位置を secondComma に入れています。その2つの位置を使って、3つの情報を切り分けています。

文字列とインデックス位置の対応イメージ

文字列012345678910111213
data,,A

このように、区切り位置が2つあると、左、中、右の3つに分けられます。

変数の役割

変数名役割
firstComma最初のカンマの位置
secondComma2つ目のカンマの位置
warriorType先頭から1つ目のカンマまで
warriorName1つ目と2つ目のカンマの間
trainingPlace2つ目のカンマ以降

concat で文字列を連結する

concat は、2つの文字列をつなげて新しい文字列を作るメソッドです。+ 演算子でも文字列連結はできますが、concat を使うと 文字列を連結する操作をしている とよりはっきり見えます。

ドラゴンボール風にたとえるなら、サイヤ人 と 修行記録 をつなげて、ひとつの技名札を完成させるようなものです。

ファイル名:Lesson15_3.java

public class Lesson15_3 {
    public static void main(String[] args) {
        String str1 = "サイヤ人";
        String str2 = str1.concat("修行記録");

        System.out.println(str2);
    }
}

実行結果

サイヤ人修行記録
サイヤ人修行記録

このプログラムでは、str1 の末尾に 修行記録 を連結して、新しい文字列を作っています。

concat の特徴

項目内容
役割文字列の末尾に別の文字列をつなげる
戻り値String
元の文字列そのまま
結果新しい文字列として返る

ここでも大切なのは、concat の結果が 戻り値 として返ってくることです。そのため、受け取る変数が必要になります。

length で文字数を取得する

length() は、文字列の長さ、つまり文字数を調べるメソッドです。文字列の大きさを知りたいときによく使います。

ドラゴンボール風にいえば、技名の文字数や修行メニューの長さを確認するようなものです。

ファイル名:Lesson15_4.java

public class Lesson15_4 {
    public static void main(String[] args) {
        String msg = "気功波";
        int len = msg.length();

        System.out.println("文字数: " + len);
    }
}

実行結果

文字数: 3

このプログラムでは、msg に入った 気功波 の文字数を length() で取得しています。

length() のポイント

項目内容
役割文字数を返す
戻り値int
使い道長さ確認、範囲チェック、ループ条件など

equals で文字列を比較する

equals は、2つの文字列の 中身 が同じかどうかを比較するメソッドです。String型では == ではなく equals を使うのが基本です。

ドラゴンボール風にいえば、2つの技名札が 見た目ではなく、本当に同じ技名か を確かめるようなものです。

ファイル名:Lesson15_5.java

public class Lesson15_5 {
    public static void main(String[] args) {
        String a = "スーパーサイヤ人";
        String b = "スーパーサイヤ人";
        String c = "サイヤ人";

        System.out.println(a.equals(b));
        System.out.println(a.equals(c));
    }
}

実行結果

true
false

このプログラムでは、a と b は同じ内容なので true、a と c は違う内容なので false になります。

equals のポイント

比較結果
内容が同じtrue
内容が違うfalse

文字列比較では、中身を見たいなら equals を使う、というのが大事な基本です。

toUpperCase と toLowerCase で大文字・小文字を変換する

toUpperCase() は英字を大文字に、toLowerCase() は英字を小文字に変換するメソッドです。文字の形をそろえたいときに便利です。

ドラゴンボール風にたとえるなら、技名コードを 戦闘表示モード と 通常表示モード に切り替えるようなものです。

ファイル名:Lesson15_6.java

public class Lesson15_6 {
    public static void main(String[] args) {
        String word = "Saiyan Power";
        System.out.println(word.toUpperCase());
        System.out.println(word.toLowerCase());
    }
}

実行結果

SAIYAN POWER
saiyan power

変換メソッドの特徴

メソッド役割戻り値
toUpperCase()大文字に変換String
toLowerCase()小文字に変換String

trim で前後の空白を削除する

trim() は、文字列の先頭と末尾にある空白を取り除くメソッドです。入力データの整形によく使います。

ドラゴンボール風にいえば、技名札の前後についてしまった余分な余白を整えて、読みやすくするようなイメージです。

ファイル名:Lesson15_7.java

public class Lesson15_7 {
    public static void main(String[] args) {
        String raw = "   サイヤ人の修行記録   ";
        System.out.println(raw.trim());
    }
}

実行結果

サイヤ人の修行記録

trim の特徴

項目内容
役割前後の空白を除去する
戻り値String
注意点真ん中の空白はそのまま残る

Stringメソッドの全体像を図で整理

ここまで見てきたように、Stringクラスには検索、切り出し、連結、比較、変換、整形といった多くのメソッドがあります。

下図は、Stringクラスの周りに、indexOf、substring、concat、equals、length、toUpperCase、toLowerCase、trim といった代表的なメソッドが並んでいる構図です。中心に String型の文字列があり、その文字列に対して どんな操作ができるか を見渡せるようになっています。文字列操作の全体像をつかむのに役立つ図です。

↓クリックすると拡大表示されます。

この図が示していること

この図は、Stringクラスが単なる文字の入れ物ではなく、文字列を操作するための多くのメソッドを持っていることを示しています。ひとつのStringに対して、検索、切り出し、連結、比較、変換、整形といったさまざまな技を使えることが見て取れます。

この図から分かること

この図を見ると、Stringクラスのメソッドはばらばらの機能ではなく、文字列を扱うための技として体系的にそろっていることが分かります。どんな場面でどのメソッドを選べばよいかの見通しも立てやすくなります。

indexOf と substring の連携を図で整理

文字列の分割では、indexOf と substring を組み合わせる流れが特に大切です。

下図は、ひとつの文字列の中にある区切り文字の位置を indexOf で見つけ、その位置を基準に substring で左側と右側を切り出す流れを示したものです。文字列の上にインデックス番号が並び、カンマの位置に印が付いているため、どこを境に分けているのかが一目で分かります。

この図が示していること

この図は、indexOf が区切り文字の位置を見つけ、その位置を使って substring が文字列を左右に分けていることを示しています。検索と切り出しが連携している流れが見える構成です。

この図から分かること

この図を見ると、文字列分割は ただ何となく切っている のではなく、まず位置を見つけてから、その位置を基準に範囲を決めていることが分かります。indexOf と substring の役割分担も理解しやすくなります。

Stringクラスのメソッドを理解すると、文字列操作の幅が大きく広がる

Stringクラスのメソッドを使えるようになると、文字列はただ表示するだけのものではなくなります。位置を探す、切り分ける、つなげる、比べる、変換する、整える、といった多彩な操作ができるようになるからです。こうした技を知っているだけで、入力の整理や表示の加工、条件判定の書き方までかなり柔軟になります。

ドラゴンボールの世界でも、サイヤ人がただ力を持っているだけでなく、その力をどう使い分けるかで戦い方が変わります。Stringクラスのメソッドもそれと同じで、文字列を扱うための便利な技がそろっているからこそ、Javaで表現できることが一気に広がります。