Java入門|Stringクラスで文字列を操作する方法

文字列を自在にあやつれると、Javaプログラムはぐっと実用的になる

Javaでプログラムを書いていると、数字だけでなく、名前やメッセージ、商品名、メールアドレスのような「文字の並び」を扱う場面がたくさん出てきます。こうした文字の集まりを、Javaでは文字列として扱います。そして、その文字列を便利に操作するために用意されているのが Stringクラス です。

これまでの学習でも、画面に文字を表示したり、キーボードから入力された内容を受け取ったりする中で、すでに文字列を使ってきました。ただ、そのときは「文字列を表示している」「文字列を受け取っている」といった使い方が中心で、Stringクラスそのものの機能をじっくり見てはいなかったかもしれません。

Stringクラスには、文字数を調べる、特定の文字を取り出す、文字列の一部を切り出す、決まった言葉で始まるかを確かめる、大文字や小文字に変換するなど、実用的な機能がたくさんそろっています。これらを使えるようになると、入力チェックや文章の加工、検索のような処理がぐっと書きやすくなります。

ここでは、Stringクラスの基本的な考え方から、代表的なメソッドの使い方まで、やさしく整理しながら丁寧に見ていきましょう。

Stringクラスとは何か

Stringクラスは、文字列を扱うために用意されたクラスです。Javaでは、文字の並びを単なる記号の集まりとしてではなく、きちんとしたオブジェクトとして扱います。

たとえば、こんにちは や Java学習中 のような文字の並びは、Stringクラスによって表現されるデータです。

考え方を整理すると、次のようになります。

考え方
文字列という仕組みそのものStringクラス
実際の文字列データこんにちは、Java、福山 など

つまり、Stringクラスは「文字列を扱うための設計図」であり、実際の文字列はその仕組みをもとに使われるデータです。

この感覚は、これまで学んできたクラスとオブジェクトの関係と同じです。文字列もまた、Javaの中ではきちんとクラスによって支えられているのです。

文字列はこれまでにも何度も使ってきた

Stringクラスは、実はかなり早い段階から登場しています。たとえば、次のような場面ではすでに文字列を使っています。

  • System.out.println でメッセージを表示するとき
  • キーボード入力を受け取るとき
  • 名前や住所などの情報を変数に入れるとき
  • 条件判断で文字の内容を比較したいとき

このように、Stringクラスは特別な場面だけで使うものではなく、Javaプログラムのあちこちで登場する基本クラスです。だからこそ、ここでしっかり仕組みと使い方を理解しておくと、今後の学習がかなりスムーズになります。

Stringクラスでできること

Stringクラスには、文字列を扱うための便利なメソッドが数多く用意されています。代表的なものを整理すると、次のようになります。

メソッドできること
charAt指定した位置の文字を取り出す
endsWith指定した文字列で終わるかを調べる
equals同じ文字列かどうかを調べる
equalsIgnoreCase大文字小文字を無視して同じかを調べる
indexOf指定した文字や文字列が最初に現れる位置を調べる
lastIndexOf指定した文字や文字列が最後に現れる位置を調べる
length文字数を調べる
substring一部分だけを切り出す
startsWith指定した文字列で始まるかを調べる
toLowerCase小文字に変換する
toUpperCase大文字に変換する

これらを見ても分かるように、Stringクラスは「文字列そのものを保存するだけ」のクラスではありません。文字列を調べたり、比較したり、加工したりするための機能がまとまっているのです。

まずはシンプルな例で見てみよう

ここでは、文字列の長さを調べ、一部を取り出すシンプルな例に置き換えて見てみましょう。

class Main {
    public static void main(String[] args) {
        // 文字列を用意する
        String message = "おはようございます";

        // 文字数を表示する
        System.out.println("文字数は" + message.length() + "文字です。");

        // 先頭の文字を表示する
        System.out.println("先頭の文字は" + message.charAt(0) + "です。");

        // 一部分を取り出して表示する
        System.out.println("途中から取り出すと「" + message.substring(4) + "」になります。");
    }
}

このプログラムでは、Stringクラスのメソッドを使って、文字列に対していくつかの処理を行っています。

コード意味
message.length()文字列全体の長さを返す
message.charAt(0)先頭の1文字を取り出す
message.substring(4)4番目の位置から最後までを取り出す

このように、Stringクラスを使うと、文字列の中身を細かく調べたり、必要な部分だけ切り出したりできます。

文字の位置は 0 から始まる

Stringクラスを使うときに、とても大切なのが「位置の数え方」です。Javaでは、文字列の先頭を 0 として数えます。

たとえば、文字列 Java を位置つきで見ると次のようになります。

位置文字
0J
1a
2v
3a

このため、charAt(0) は先頭の J を取り出し、charAt(2) は v を取り出します。

初心者のうちは、1文字目だから 1 を指定したくなることがありますが、Javaでは最初が 0 です。ここはとても大事なポイントです。

lengthで文字数を調べる

文字列の長さを知りたいときには length を使います。これはとてもよく使うメソッドです。

class Main {
    public static void main(String[] args) {
        String city = "福山市";
        System.out.println(city.length());
    }
}

このコードでは、福山市 という文字列の長さを調べています。length は、文字列に何文字入っているかを整数で返します。

文字数を調べる処理は、入力チェックなどでもよく使います。たとえば、パスワードが短すぎないか、名前が空欄ではないか、という確認にも応用できます。

charAtで指定した位置の文字を取り出す

文字列の中から特定の1文字を取り出したいときには charAt を使います。

class Main {
    public static void main(String[] args) {
        String word = "さくら";
        System.out.println(word.charAt(1));
    }
}

この場合、表示されるのは く です。理由は、位置が 0 から始まるためです。

位置文字
0
1
2

charAt は、文字列の中を1文字ずつ確認したいときにも便利です。たとえば、先頭の文字だけ調べたい、3文字目だけ表示したい、といった場面で活躍します。

substringで一部分を切り出す

文字列の一部だけを取り出したいときには substring を使います。これはとても実用的なメソッドです。

引数が1つの形

class Main {
    public static void main(String[] args) {
        String text = "今日の天気は晴れです";
        System.out.println(text.substring(3));
    }
}

この場合は、3番目の位置から最後までが取り出されます。

引数が2つの形

class Main {
    public static void main(String[] args) {
        String text = "今日の天気は晴れです";
        System.out.println(text.substring(3, 6));
    }
}

こちらは、3番目の位置から 6番目の位置の手前までを取り出します。

この「終わりの位置そのものは含まれない」という点は大切です。

整理すると次のようになります。

書き方意味
substring(開始位置)開始位置から最後まで
substring(開始位置, 終了位置)開始位置から終了位置の手前まで

substring は、郵便番号の一部を取り出す、日付文字列から年だけを取り出す、文章の先頭だけ表示する、といった場面でよく使われます。

equalsで文字列を正しく比較する

文字列が同じ内容かどうかを調べるときには equals を使います。

class Main {
    public static void main(String[] args) {
        String answer = "はい";

        if (answer.equals("はい")) {
            System.out.println("確認できました。");
        }
    }
}

ここで大切なのは、文字列の比較では equals を使うことです。数値の比較のように == を使いたくなることがありますが、文字列の内容を比べたい場合は equals を使うのが基本です。

初心者のうちは、この部分で混乱しやすいので、しっかり覚えておきたいところです。

equalsIgnoreCaseで大文字小文字を気にせず比較する

英単語などを扱うときには、大文字と小文字の違いを気にせず比較したいことがあります。そんなときに使うのが equalsIgnoreCase です。

class Main {
    public static void main(String[] args) {
        String code = "java";

        if (code.equalsIgnoreCase("JAVA")) {
            System.out.println("同じ言葉として扱います。");
        }
    }
}

この場合、java と JAVA は大文字小文字が違っていても、同じものとして判定されます。

ログイン名やコマンドの確認などで、大文字小文字の違いを無視したい場合に便利です。

startsWithとendsWithで始まりと終わりを調べる

ある文字列が特定の言葉で始まっているか、または終わっているかを確認したいときには startsWith と endsWith を使います。

class Main {
    public static void main(String[] args) {
        String fileName = "report.pdf";

        System.out.println(fileName.startsWith("rep"));
        System.out.println(fileName.endsWith(".pdf"));
    }
}

この例では、report.pdf が rep で始まるか、.pdf で終わるかを調べています。

これは、ファイル名の拡張子を確認したり、メールアドレスの形式を簡単に見たりするときにも応用できます。

indexOfとlastIndexOfで位置を調べる

ある文字や文字列が、どこに現れるかを調べたいときには indexOf と lastIndexOf を使います。

class Main {
    public static void main(String[] args) {
        String text = "りんごとみかんとりんご";

        System.out.println(text.indexOf("りんご"));
        System.out.println(text.lastIndexOf("りんご"));
    }
}

indexOf は最初に見つかった位置を返し、lastIndexOf は最後に見つかった位置を返します。

この違いを表で見ると分かりやすいです。

メソッド調べる内容
indexOf最初に現れる位置
lastIndexOf最後に現れる位置

検索や区切り文字の位置確認などでよく使われます。

toUpperCaseとtoLowerCaseで文字の形をそろえる

英字を含む文字列では、大文字小文字を統一したいことがあります。そんなときには toUpperCase と toLowerCase が便利です。

class Main {
    public static void main(String[] args) {
        String team = "JavaClub";

        System.out.println(team.toUpperCase());
        System.out.println(team.toLowerCase());
    }
}

このようにして文字の形をそろえてから比較すると、入力のゆれに強いプログラムが作れます。

たとえば、YES、Yes、yes を全部小文字にしてから比較すれば、判定がしやすくなります。

Stringクラスの主なメソッドを整理して覚えよう

ここまで出てきた主なメソッドを、使いどころといっしょに整理しておきましょう。

メソッド戻り値主な使いどころ
length()int文字数チェック
charAt(int index)char特定位置の1文字取得
substring(int beginIndex)String途中から後ろを取り出す
substring(int beginIndex, int endIndex)String一部分だけ切り出す
equals(Object obj)boolean完全一致の比較
equalsIgnoreCase(String str)boolean大文字小文字を無視した比較
startsWith(String prefix)boolean先頭の確認
endsWith(String suffix)boolean末尾の確認
indexOf(String str)int最初に出る位置の検索
lastIndexOf(String str)int最後に出る位置の検索
toUpperCase()String大文字へ変換
toLowerCase()String小文字へ変換

この表は、あとから見返せるようにしておくとかなり便利です。

実用的な例で見てみよう

ここでは、入力されたメールアドレス風の文字列に @ が含まれているかを調べるシンプルな例を見てみましょう。

class Main {
    public static void main(String[] args) {
        // 確認する文字列
        String address = "user@example.com";

        // 文字数を表示する
        System.out.println("文字数は" + address.length() + "文字です。");

        // @ が含まれている位置を調べる
        int pos = address.indexOf("@");

        // 判定結果を表示する
        if (pos != -1) {
            System.out.println("@ は " + pos + " 番目の位置にあります。");
        } else {
            System.out.println("@ は見つかりませんでした。");
        }

        // 末尾の確認
        if (address.endsWith(".com")) {
            System.out.println(".com で終わっています。");
        }
    }
}

この例では、length、indexOf、endsWith を組み合わせています。Stringクラスのメソッドは、1つだけで使うよりも、いくつかを組み合わせて使うことで実践的な力を発揮します。

Stringクラスのメソッドは元の文字列を書き換えない

ここはとても大切なポイントです。Stringクラスのメソッドの多くは、元の文字列そのものを書き換えるのではなく、変換後の新しい文字列を返します。

たとえば、toUpperCase を呼び出しただけでは、元の変数の中身は変わりません。

class Main {
    public static void main(String[] args) {
        String text = "java";

        System.out.println(text.toUpperCase());
        System.out.println(text);
    }
}

この場合、最初の表示は JAVA になりますが、その次の表示は java のままです。

変換結果を今後も使いたいなら、次のように受け取っておく必要があります。

class Main {
    public static void main(String[] args) {
        String text = "java";
        text = text.toUpperCase();

        System.out.println(text);
    }
}

この性質は、Stringクラスを使ううえでとても大事です。初心者がつまずきやすい部分でもあるので、しっかり意識しておきたいです。

図でイメージすると理解しやすい

Stringクラスは、文字列に対していろいろな操作をする仕組みだと考えると分かりやすいです。図では、1つの文字列に対して、長さを調べたり、一部分を切り出したり、比較したりする流れを表すと理解しやすくなります。

この図は、1つの文字列に対して複数のメソッドが使えることを表現しています。中央にある こんにちはJava という文字列に対して、長さを調べる、先頭の文字を取り出す、一部分を切り出す、先頭一致を確認する、といった処理が広がっていく構成です。

文字列は1つでも、その文字列に対していろいろな角度から処理ができることが、この図からつかみやすくなります。Stringクラスは「文字を入れる箱」というより、「文字列を調べたり加工したりするための便利な機能を持ったクラス」だと理解すると、とても使いやすくなります。

よくある注意点

Stringクラスを使うときには、いくつか気をつけたい点があります。

注意点内容
位置は 0 から始まる1文字目は 0 番目
equals を使って比較する文字列の内容比較では equals が基本
substring の終わりは含まれない終了位置の手前までが取り出される
変換結果は新しい文字列元の文字列が自動で変わるわけではない

この4つは、最初にしっかり意識しておくとミスがかなり減ります。

Stringクラスを学ぶと何が変わるか

Stringクラスをしっかり使えるようになると、Javaで作れるプログラムの幅が大きく広がります。なぜなら、実際のプログラムでは、数字よりもむしろ文字列を扱う場面のほうが多いくらいだからです。

たとえば、次のような処理につながっていきます。

  • 名前の入力チェック
  • メールアドレスの簡易確認
  • 商品コードの先頭文字の判定
  • メッセージの整形
  • 入力された言葉の検索
  • データの一部分だけの取り出し

つまり、Stringクラスは単なる基礎知識ではなく、今後の実用的なプログラムづくりの土台になります。

これから意識したい見方

これからStringクラスを学ぶときには、ただメソッド名を覚えるのではなく、次の視点で見ていくと理解しやすいです。

見るポイントたしかめること
何をするメソッドか調べるのか、比較するのか、切り出すのか
引数が必要か位置や比較対象の文字列を渡すか
戻り値は何か文字、文字列、整数、真偽値のどれか
元の文字列が変わるか新しい文字列が返るだけか

この見方ができるようになると、Stringクラスだけでなく、ほかのクラスライブラリのメソッドも理解しやすくなります。

Stringクラスは、Javaの学習の中でもとても出番が多く、実践に結びつきやすいクラスです。ここで基本をしっかり押さえておくと、入力処理や検索、判定、加工など、いろいろな場面で役立てられるようになります。