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

文字列の中身を見られるようになると、Javaの処理はもっと細かくなる。
length() と charAt() は、文字列を調べる最初の基本技。

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

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

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

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

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

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

どちらもシンプルですが、文字列処理の土台になるとても大切なメソッドです。

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

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

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

順番文字
1文字目
2文字目
3文字目

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

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

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

鬼滅の刃でたとえると、任務の巻物に書かれた文字を、ただ読むだけでなく、

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

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

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ではこの数え方が基本になります。

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

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

書き方は次の形です。

文字列変数.length()

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

文字列length() の結果
Java4
さくら3
水月2
鬼殺隊3

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

鬼滅の刃でたとえると、length() は巻物に書かれた文字を全部数えて、何文字あるかを報告する技です。

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

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

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

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

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

ファイル名:Sample1.java

class Sample1
{
    public static void main(String[] args)
    {
        // 文字列を用意する
        String str = "さくら";

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

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

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

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

String str = "さくら";

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

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

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

さくらの1文字目はさです。
さくらの2文字目はくです。
さくらの文字数は3です。

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

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

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

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

鬼滅の刃でたとえると、まず さくら と書かれた巻物を用意します。

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

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

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

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

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

さくら を位置つきで見ると、次のようになります。

Javaでの位置文字
0
1
2

そのため、str.charAt(0) は さ を返します。
str.charAt(1) は く を返します。

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

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

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

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

鬼滅の刃でたとえると、巻物の中から指定された位置の1文字だけを抜き出して読む技です。

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

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

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

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

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

さくら の場合は、次のようになります。

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

鬼滅の刃でたとえると、鬼殺隊の巻物管理では、最初の札番号が 0 から始まる特別な決まりになっている感じです。

最初は少し不思議に感じるかもしれません。
でも、配列やリストでも同じように 0 から数える考え方が出てくるので、ここで慣れておくとかなり楽になります。

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

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

int len = str.length();

str には さくら が入っています。

さくら は 3文字なので、length() の結果は 3 です。

文字列length() の結果
さくら3
Java4
こんにちは5

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

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

int len = str.length();

鬼滅の刃でたとえると、length() は巻物全体を見て、「この巻物には3文字あります」と数えてくれる技です。

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

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

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

たとえば、さくら は3文字です。

文字位置
0
1
2

文字数は3ですが、最後の位置は2です。

つまり、

str.length() - 1

が最後の文字の位置になります。

文字列length()最後の位置
さくら32
Java43
水月21

最後の文字を取り出したい場合は、考え方として次のようになります。

str.charAt(str.length() - 1)

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

鬼滅の刃でたとえると、まず巻物が何文字あるかを数え、最後の札番号を求めてから、その位置の文字を読む流れです。

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

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

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

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

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

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

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

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

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

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

この図が示していること

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

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

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

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

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

String str = "さくら";

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

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

これは、String クラスがとてもよく使われる特別なクラスだからです。
ダブルクォーテーションで囲まれた文字列は、文字列リテラルと呼ばれます。

"さくら"

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

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

鬼滅の刃でたとえると、さくら と書かれた巻物を、短い書き方でそのまま用意できるようなものです。

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

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

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

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

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

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

String str = "こんにちは";

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

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

鬼滅の刃でたとえると、よく使う巻物は、いちいち複雑な儀式で作らなくても、すぐに用意できる特別な扱いになっているようなものです。

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

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

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

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

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

まずは、

String str = "文字列";

という書き方に慣れておくと安心です。

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

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

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

鬼滅の刃でたとえると、任務の巻物の先頭にある印を確認したり、合言葉が短すぎないかを調べたりするような場面です。

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

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

str.charAt(str.length() - 1)

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

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

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

この図が示していること

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

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

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

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

ここから分かるのは、文字数と位置番号は同じではないということです。
文字数が3なら、位置番号は 0、1、2 なので、最後の位置は 3 ではなく 2 になります。

よくある注意点

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

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

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

たとえば、さくら の length() は 3 ですが、str.charAt(3) は使えません。
位置として使えるのは 0、1、2 だからです。

つまり、最後の文字を取り出すときに使うのは str.charAt(str.length() - 1) です。

鬼滅の刃でたとえると、巻物に3文字あるからといって、3番札があるわけではありません。
札番号は 0、1、2 なので、最後は2番札です。

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

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

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

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

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

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

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

鬼滅の刃でたとえると、巻物の文字を読むための基本訓練です。
どこに何番の文字があるのか、全部で何文字あるのかを正しく見られるようになることで、より複雑な任務文の解析にも進めるようになります。