Java超|lengthとcharAtで文字列を調べる

文字列の中身を読めるようになると、Javaの処理は一気に細かくなる。length() と charAt() は、文字の巻物を調べるための最初の基本技です。

Javaで文字列を扱うようになると、ただ文字を表示するだけではなく、文字列の中身を細かく調べたくなる場面が増えてきます。

たとえば、次のような場面です。

やりたいこと
文字列が何文字あるか調べたい戦士名が短すぎないか確認する
先頭の文字を取り出したい流派コードや合言葉の最初を調べる
2文字目や3文字目を確認したい指定位置の文字を判定する
最後の文字を調べたい末尾の記号や印を確認する

こうした処理で役立つのが、String クラスの length() メソッドと charAt() メソッドです。

length() は、文字列が何文字あるかを調べるメソッドです。
charAt() は、指定した位置にある1文字を取り出すメソッドです。

ドラゴンボールの世界観でたとえると、文字列は戦士管理本部にある「文字の巻物」です。

length() は、その巻物に何文字書かれているかを数える技です。
charAt() は、巻物の指定された位置にある1文字を読む技です。

どちらもシンプルですが、文字列処理の土台になるとても大切なメソッドです。特に、Javaでは文字の位置を 0 から数えるため、charAt() を使うときは位置番号の考え方が重要になります。

文字列の長さと文字を取り出すとはどういうことか

文字列とは、文字が順番に並んだデータです。

たとえば、さくら という文字列なら、次の3つの文字が並んでいます。

日常の順番文字
1文字目
2文字目
3文字目

このとき、プログラムでは次のようなことを調べたくなります。

調べたいこと結果
何文字あるか3文字
最初の文字は何か
2文字目は何か
最後の文字は何か

この確認を行うために、String クラスには length() と charAt() が用意されています。

ドラゴンボールでたとえると、戦士管理本部の巻物に書かれた文字を、ただ読むだけでなく、

全部で何文字あるか数える。
先頭の文字を確認する。
指定された位置の文字を読む。
最後の印を確認する。

というように、細かく調べられるようになるイメージです。

たとえば、流派名 亀仙流 が何文字あるかを調べたり、戦士コード KAME-001 の先頭が K かどうかを確認したりできます。

charAt()は指定した位置の1文字を取り出す

charAt() は、指定した位置にある1文字を取り出すためのメソッドです。

書き方は次の形です。

文字列変数.charAt(位置)

charAt() に数字を渡すと、その位置にある文字が返されます。

戻り値の型は char です。
char は、1文字を表す型です。

たとえば、Java という文字列なら、文字の位置は次のようになります。

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

このため、charAt(0) は J を返します。
charAt(1) は a を返します。

ここでとても大切なのは、文字の位置は 0 から数えるということです。

日常では、最初の文字を 1文字目 と呼びます。
しかし、Javaの位置番号では、最初の文字は 0 番目です。

ドラゴンボールでたとえると、戦士管理本部の巻物では、最初の文字に 0 番の札がついているようなものです。

普通の数え方とは少し違いますが、Javaではこの数え方が基本になります。

日常の言い方Javaでの位置
1文字目0
2文字目1
3文字目2
4文字目3

この 0 から始まる考え方は、配列やリストでもよく出てきます。
そのため、charAt() を学ぶ段階で慣れておくと、後の学習がかなり楽になります。

length()は文字列全体の文字数を返す

length() は、文字列に含まれている文字数を返すメソッドです。

書き方は次の形です。

文字列変数.length()

たとえば、Java という文字列に length() を使うと、4 が返ります。

文字列length() の結果
Java4
さくら3
悟空2
亀仙流3
神流2

length() の戻り値は int です。
つまり、文字数を整数として返します。

ドラゴンボールでたとえると、length() は巻物に書かれた文字を全部数えて、この巻物には何文字あります、と報告する技です。

文字数を調べる処理は、実際のプログラムでもよく使います。

場面length() の使い方
名前の入力確認空欄ではないか調べる
パスワード確認文字数が短すぎないか調べる
メッセージ確認入力文字数が制限内か調べる
最後の文字を取り出す準備最後の位置を求める
流派名の確認流派名が入力されているか調べる

文字列を扱うなら、length() はかなり出番の多い基本メソッドです。

図:charAt()とlength()の基本

この図が示していること

この図では、文字列 さくら に対して、位置番号が 0、1、2 と対応していることを表しています。

charAt(0) は、0番目の文字である さ を取り出します。
charAt(1) は、1番目の文字である く を取り出します。
length() は、文字列全体を見て、3文字であることを返します。

ここから分かるのは、charAt() は文字列の一部を見るメソッドであり、length() は文字列全体を見るメソッドだということです。

length() と charAt() の動きを確認する

実際のプログラムで、length() と charAt() の動きを見てみましょう。

ファイル名:Sample1.java

class Sample1
{
    public static void main(String[] args)
    {
        // 戦士管理本部の巻物に書かれた文字列を用意する
        String scroll = "かめはめ波";

        // 1文字目と2文字目を取り出す
        char ch1 = scroll.charAt(0);
        char ch2 = scroll.charAt(1);

        // 文字列の長さを調べる
        int len = scroll.length();

        // 結果を表示する
        System.out.println(scroll + "の1文字目は" + ch1 + "です。");
        System.out.println(scroll + "の2文字目は" + ch2 + "です。");
        System.out.println(scroll + "の文字数は" + len + "です。");
    }
}

このプログラムでは、かめはめ波 という文字列を用意しています。

String scroll = "かめはめ波";

そして、その文字列に対して charAt() と length() を使っています。

char ch1 = scroll.charAt(0);
char ch2 = scroll.charAt(1);
int len = scroll.length();
コード処理内容
scroll.charAt(0)0番目の文字を取り出す
scroll.charAt(1)1番目の文字を取り出す
scroll.length()文字数を調べる

実行結果は次のようになります。

かめはめ波の1文字目はかです。
かめはめ波の2文字目はめです。
かめはめ波の文字数は5です。

とてもシンプルですが、String クラスの基本がしっかり詰まっています。

プログラムの流れを順番に見る

Sample1.java の処理を順番に整理すると、次のようになります。

順番処理説明
1String scroll = "かめはめ波";文字列を用意する
2scroll.charAt(0)先頭の文字を取り出す
3scroll.charAt(1)2文字目を取り出す
4scroll.length()文字数を調べる
5System.out.println(...)結果を表示する

ドラゴンボールでたとえると、まず かめはめ波 と書かれた技名の巻物を用意します。

次に、その巻物の 0 番目の文字を読みます。
さらに、1 番目の文字を読みます。
最後に、巻物全体に何文字書かれているかを数えます。

このように、文字列そのものに対してメソッドを呼び出しているのがポイントです。

String 型の変数 scroll は、ただ文字列を持っているだけではありません。
String クラスのメソッドを使うことで、中身を調べられる対象になります。

charAt()は指定位置の文字を返す

Sample1.java では、次のように charAt() を使っています。

char ch1 = scroll.charAt(0);
char ch2 = scroll.charAt(1);

かめはめ波 を位置つきで見ると、次のようになります。

Javaでの位置文字
0
1
2
3
4

そのため、scroll.charAt(0) は か を返します。
scroll.charAt(1) は め を返します。

コード返される文字
scroll.charAt(0)
scroll.charAt(1)
scroll.charAt(2)
scroll.charAt(4)

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

たとえば、次のような場面で役立ちます。

場面使い方
名前の先頭文字を表示するcharAt(0) を使う
流派コードの先頭を判定するcharAt(0) を調べる
指定位置の文字を確認するcharAt(位置) を使う
最後の文字を取り出すlength() と組み合わせる

ドラゴンボールでたとえると、巻物の中から指定された位置の1文字だけを抜き出して読む技です。

技名の最初の文字を確認したり、流派コードの先頭が 亀 か 惑 かを調べたりできます。

0から数えることに注意する

charAt() を使うときに、いちばんつまずきやすいのが位置番号です。

日常では、最初の文字を 1文字目 と呼びます。
しかし、Javaでは最初の文字の位置は 0 です。

普段の言い方Javaでの位置
1文字目0
2文字目1
3文字目2
4文字目3

そのため、scroll.charAt(1) は1文字目ではなく、2文字目を返します。

かめはめ波 の場合は、次のようになります。

コード日常の言い方返される文字
scroll.charAt(0)1文字目
scroll.charAt(1)2文字目
scroll.charAt(2)3文字目
scroll.charAt(3)4文字目
scroll.charAt(4)5文字目

ドラゴンボールでたとえると、戦士管理本部の巻物管理では、最初の札番号が 0 から始まる特別な決まりになっている感じです。

最初は少し不思議に感じるかもしれません。
でも、Javaではこの数え方が基本です。

このルールに慣れると、文字列だけでなく、配列やリストの学習にもつながります。

length()は文字列全体の長さを返す

Sample1.java では、次のように length() を使っています。

int len = scroll.length();

scroll には かめはめ波 が入っています。

かめはめ波 は 5文字なので、length() の結果は 5 です。

文字列length() の結果
かめはめ波5
さくら3
Java4
こんにちは5
亀仙流3

length() は、文字数を int 型で返します。

そのため、次のように int 型の変数で受け取れます。

int len = scroll.length();

ドラゴンボールでたとえると、length() は巻物全体を見て、この巻物には5文字あります、と数えてくれる技です。

length()は最後の文字を調べるときにも使える

length() は文字数を調べるだけではなく、最後の文字を取り出すときにも役立ちます。

なぜなら、Javaの位置は 0 から始まるため、最後の位置は 文字数 - 1 になるからです。

たとえば、かめはめ波 は5文字です。

文字位置
0
1
2
3
4

文字数は 5 ですが、最後の位置は 4 です。

つまり、次の式が最後の文字の位置になります。

scroll.length() - 1

文字列ごとに整理すると、次のようになります。

文字列length()最後の位置
かめはめ波54
さくら32
Java43
悟空21

最後の文字を取り出したい場合は、次のように書きます。

scroll.charAt(scroll.length() - 1)

これは、文字列の長さを調べて、その最後の位置にある文字を取り出す考え方です。

ドラゴンボールでたとえると、まず巻物が何文字あるかを数え、最後の札番号を求めてから、その位置の文字を読む流れです。

図:最後の文字はlength() - 1で求める

この図が示していること

この図では、文字列 かめはめ波 の最後の文字を取り出す考え方を表しています。

かめはめ波 は5文字なので、length() の結果は 5 です。
しかし、位置番号は 0 から始まるため、最後の文字 波 の位置は 4 です。

そのため、最後の位置は length() - 1 で求めます。

scroll.charAt(scroll.length() - 1) と書くと、最後の文字を取り出せます。

ここから分かるのは、文字数と位置番号は同じではないということです。

文字数が5なら、位置番号は 0、1、2、3、4 なので、最後の位置は 5 ではなく 4 になります。

charAt()とlength()の違いを整理する

charAt() と length() は、どちらも文字列を調べるメソッドです。

ただし、役割は違います。

メソッド戻り値役割
charAt(位置)char指定位置の1文字を返す
length()int文字列全体の文字数を返す

もう少し感覚的にいうと、こうです。

メソッド見ている範囲ドラゴンボールでたとえると
charAt()文字列の一部巻物の指定位置の文字を読む
length()文字列全体巻物全体の文字数を数える

charAt() は、どの文字かを調べるメソッドです。
length() は、何文字あるかを調べるメソッドです。

この2つをセットで覚えると、文字列の基本操作がかなり分かりやすくなります。

たとえば、次のように考えられます。

やりたいこと使うメソッド
文字数を知りたいlength()
先頭の文字を知りたいcharAt(0)
2文字目を知りたいcharAt(1)
最後の文字を知りたいcharAt(length() - 1)

Stringオブジェクトの作り方にも注目する

Sample1.java では、文字列を次のように用意していました。

String scroll = "かめはめ波";

この書き方では、new を使っていません。

それでも、String クラスのオブジェクトを扱えています。

これは、String クラスがとてもよく使われる特別なクラスだからです。

ダブルクォーテーションで囲まれた文字列は、文字列リテラルと呼ばれます。

"かめはめ波"

この文字列リテラルを使うことで、String オブジェクトを簡単に表せます。

書き方意味
String scroll = "かめはめ波";文字列リテラルを使って文字列を用意する
scroll.charAt(0)scroll の0番目の文字を取り出す
scroll.length()scroll の文字数を調べる

ドラゴンボールでたとえると、かめはめ波 と書かれた巻物を、短い書き方でそのまま用意できるようなものです。

newを使ったStringの作り方もある

これまで学んだオブジェクト作成の形で、String を作ることもできます。

String scroll = new String("こんにちは");

この書き方も文法的には間違いではありません。

ただし、普段のJavaプログラムでは、文字列を作るときにわざわざ new String(...) と書くことはあまりありません。

一般的には、次のように文字列リテラルを使います。

String scroll = "こんにちは";

理由は、こちらのほうが短く、読みやすく、Javaでよく使われる自然な書き方だからです。

書き方特徴
String scroll = "こんにちは";短くて分かりやすい。一般的によく使う
String scroll = new String("こんにちは");書けるが、普段はあまり使わない

ドラゴンボールでたとえると、よく使う巻物は、いちいち複雑な生成装置で作らなくても、すぐに用意できる特別な扱いになっているようなものです。

文字列リテラルがよく使われる理由

文字列リテラルの書き方がよく使われる理由は、とてもシンプルです。

理由内容
書き方が短いコードがすっきりする
読みやすい文字列だとすぐ分かる
無駄が少ない不必要な new を書かなくてよい
一般的な書き方多くのJavaコードで使われる

Javaでは文字列を非常によく使います。

そのため、文字列を毎回 new String(...) で作っていると、コードが長くなってしまいます。

まずは、次の書き方に慣れておくと安心です。

String scroll = "文字列";

この書き方でも、scroll に対して length() や charAt() を使えます。

つまり、文字列リテラルで用意した文字列も、String クラスの便利なメソッドで調べられるということです。

実務や学習でどう役立つのか

charAt() と length() は、シンプルですが、実際によく使うメソッドです。

場面使い方
名前の最初の文字を表示するcharAt(0) を使う
商品コードの先頭文字を確認するcharAt(0) で判定する
入力文字数の制限を確認するlength() で調べる
空文字かどうかを調べるlength() が 0 か確認する
最後の文字を調べるcharAt(length() - 1) を使う
流派コードを確認する先頭文字が 亀、神、惑 などか見る

ドラゴンボールでたとえると、任務の巻物の先頭にある流派印を確認したり、合言葉が短すぎないかを調べたりするような場面です。

特に、length() と charAt() を組み合わせる考え方は大事です。

たとえば、最後の文字を取り出すには、文字数を調べてから、最後の位置を求めます。

scroll.charAt(scroll.length() - 1)

この考え方は、今後学ぶ substring() や indexOf() などの文字列メソッドにもつながります。

実用例:流派コードの先頭と最後の文字を調べる

もう少し実用的な例として、流派コードを調べるプログラムを見てみましょう。

class Findcode
{
    public static void main(String[] args)
    {
        String styleCode = "亀-001";

        int len = styleCode.length();
        char first = styleCode.charAt(0);
        char last = styleCode.charAt(styleCode.length() - 1);

        System.out.println("流派コードは" + styleCode + "です。");
        System.out.println("文字数は" + len + "文字です。");
        System.out.println("先頭の文字は" + first + "です。");
        System.out.println("最後の文字は" + last + "です。");

        if (first == '亀') {
            System.out.println("このコードは亀仙流の戦士コードです。");
        }
    }
}

このプログラムでは、流派コード 亀-001 を調べています。

処理コード結果
文字数を調べるstyleCode.length()5
先頭の文字を取り出すstyleCode.charAt(0)
最後の文字を取り出すstyleCode.charAt(styleCode.length() - 1)1
先頭文字を判定するfirst == '亀'亀仙流かどうかを確認

このように、length() と charAt() を組み合わせると、文字列の形をチェックできます。

ドラゴンボールでたとえると、戦士管理本部の登録コードを見て、

何文字あるか。
先頭の流派印は何か。
最後の番号は何か。
亀仙流のコードかどうか。

を確認しているイメージです。

図:流派コードをlength()とcharAt()で調べる

この図が示していること

この図では、流派コード 亀-001 を length() と charAt() で調べる流れを示しています。

length() を使うと、文字数が 5 であることが分かります。
charAt(0) を使うと、先頭の文字が 亀 であることが分かります。
charAt(length() - 1) を使うと、最後の文字が 1 であることが分かります。

ここから分かるのは、length() と charAt() を組み合わせることで、文字列の長さだけでなく、先頭や末尾の文字も確認できるということです。

戦士コード、商品コード、入力文字列、合言葉などをチェックするときに、この考え方が役立ちます。

よくある注意点

charAt() と length() を使うときには、いくつか注意点があります。

注意点内容
位置は0から始まる1文字目は0、2文字目は1
charAt() は1文字だけ返す戻り値は char
length() は文字数を返す戻り値は int
最後の位置は length() - 1文字数そのものを位置として使わない
String は文字列リテラルで作れるnew を使わなくてもよい

特に注意したいのは、最後の位置です。

たとえば、かめはめ波 の length() は 5 ですが、scroll.charAt(5) は使えません。

位置として使えるのは 0、1、2、3、4 だからです。

つまり、最後の文字を取り出すときに使うのは、次の形です。

scroll.charAt(scroll.length() - 1)

ドラゴンボールでたとえると、巻物に5文字あるからといって、5番札があるわけではありません。

札番号は 0、1、2、3、4 なので、最後は4番札です。

このズレを理解しておくと、charAt() の位置指定ミスを防ぎやすくなります。

この先の文字列処理につながる基本

length() と charAt() は、String クラスの中でも最初に押さえておきたい基本メソッドです。

この2つを理解しておくと、この先に出てくる文字列処理も分かりやすくなります。

今後学ぶメソッドlength() や charAt() とのつながり
substring()位置番号を使って一部分を切り出す
indexOf()文字が見つかった位置を返す
startsWith()先頭の文字列を調べる
endsWith()末尾の文字列を調べる

文字列処理では、位置番号の考え方がとても重要です。

charAt() で指定位置の文字を取り出す。
length() で全体の文字数を調べる。
最後の位置は length() - 1 で求める。

この基本が分かると、String クラスのほかのメソッドもずっと理解しやすくなります。

ドラゴンボールでたとえると、巻物の文字を読むための基本訓練です。

どこに何番の文字があるのか。
全部で何文字あるのか。
最後の文字はどこにあるのか。

これを正しく見られるようになることで、より複雑な任務文や戦士コードの解析にも進めるようになります。