Stringは「文字列」を扱うためのクラス

Javaで文字列を扱うときは、 String を使います。

String name = "山田";

String message = "こんにちは";

このように、 文字列を変数に入れて扱うことができます。

ただし、 Stringは単純に「文字を入れておく箱」 と考えるだけではありません。

Stringには、文字列を扱うためのさまざまな処理が用意されています。

まずは、 開発でよく使うところから見ていきます。

Stringを作る

一番基本的な書き方は、 文字列リテラルを使う方法です。

String name = "山田";

String language = "Java";

文字列は " " ダブルクォーテーションで囲みます。

例えば、

String str = "Hello";

であれば、 str"Hello" という文字列が入ります。

文字列を比較する

Stringで特に重要なのが、 文字列の比較です。

例えば、

String a = "Java";
String b = "Java";

この2つが同じ文字列か確認したいとします。

このとき、

if (a.equals(b)) {

    System.out.println("同じ");

}

のように equals() を使います。

ここは重要

Stringの内容を比較するときは、 基本的に == ではなく equals() を使います。

== は 「同じオブジェクトを参照しているか」 を確認するための演算子です。

一方、

a.equals(b)

は、 「文字列の内容が同じか」 を確認します。

文字列の長さを調べる

文字列の長さを取得するときは、 length() を使います。

String str = "Java";

int length = str.length();

System.out.println(length);

結果は、

4

になります。

入力チェックなどでもよく使います。

if (name.length() == 0) {

    System.out.println("名前が入力されていません");

}

文字列の一部を取り出す

実際の業務システムでは、 文字列の一部だけを取り出す処理もよくあります。

例えば、

String code = "ABC123456";

先頭から3文字を取り出したい場合は、 substring() を使います。

String result = code.substring(0, 3);

System.out.println(result);

結果は、

ABC

です。

substring()の考え方

substring(開始位置, 終了位置)

開始位置は含まれますが、 終了位置は含まれません。

そのため、

substring(0, 3)

は、

0
1
2

の3文字を取得します。

文字列を変換する

Stringには、 文字列を変換するためのメソッドもあります。

大文字・小文字を変換する

String str = "Java";

System.out.println(
    str.toUpperCase()
);

System.out.println(
    str.toLowerCase()
);

結果は、

JAVA
java

となります。

前後の空白を取り除く

入力値などの前後に余計な空白が入っている場合は、 trim() が使えます。

String name = "  山田  ";

String result = name.trim();

System.out.println(result);

ただし、 trim() は文字列の途中にある空白を削除するものではありません。

文字列を分割する

CSVのような文字列を扱う場合、 区切り文字で分割したくなることがあります。

String data = "001,山田,東京";

String[] values = data.split(",");

System.out.println(values[0]);
System.out.println(values[1]);
System.out.println(values[2]);

結果は、

001
山田
東京

となります。

split() を使うと、 文字列を区切って配列として扱えます。

文字列を連結する

String同士をつなげる場合は、 + が使えます。

String firstName = "山田";
String lastName = "太郎";

String name = firstName + lastName;

System.out.println(name);

結果は、

山田太郎

となります。

さらに、

String message =
    "こんにちは、" + name + "さん";

のように、 文字列と変数を組み合わせることもできます。

StringBuilderを使う

Stringを + で何度も連結する処理では、 StringBuilder が使われることがあります。

StringBuilder builder = new StringBuilder();

builder.append("Java");
builder.append("を");
builder.append("勉強する");

String result = builder.toString();

System.out.println(result);

結果は、

Javaを勉強する

です。

StringBuilderは、 文字列を組み立てながら内容を変更できるオブジェクトです。

String immutable
StringBuilder 内容を変更しながら組み立てられる

特に、 ループの中で大量の文字列を連結するときなどに StringBuilder が候補になります。

実際の業務コードではどう使うのか

実際の業務システムでは、 Stringはさまざまな場面に登場します。

入力値 画面から受け取る文字列
DB SQLや検索条件に使う文字列
JSON APIで扱う文字列
CSV ファイルのデータを扱う文字列

例えば、 APIから受け取った値をチェックしたり、

if (status.equals("SUCCESS")) {

    // 正常処理

}

CSVの値を分割したり、

String[] values = line.split(",");

コードの一部を取り出したりします。

String code = value.substring(0, 3);

つまりStringは、 Javaの基本文法というだけではなく、 業務システムのあちこちで登場する型 です。

Stringは少し特殊

ここまで分かれば、 Stringを使ううえでは十分です。

ただし、 Stringについて調べていると、 次のような言葉を見かけることがあります。

String Pool

文字列リテラルを効率よく扱うために、 JVMが管理している領域です。

例えば、

String a = "Java";
String b = "Java";

のように同じ文字列リテラルを使った場合、 文字列を共有することがあります。

immutable

Stringは、 作成した文字列そのものを変更できません。

String str = "Java";

str = str + " Programming";

この場合、 元の "Java" が変更されたのではなく、 新しい文字列が作られています。

intern()

intern() は、文字列をString Pool上の文字列として扱うための仕組みです。

String a = new String("Java");

String b = a.intern();

このあたりは、 Stringを使うために最初から覚える必要はありません。

まずは、
equals() で内容を比較する。
Stringはimmutableである。
StringBuilderは文字列を組み立てるときに使える。

この3つを押さえておけば十分です。

もう一歩進んだときに思い出せばOK

String Poolや intern()、 JVM内部の文字列管理については、 必要になったときに詳しく見ていけば問題ありません。

Stringを見たら、まず何を考える?

業務コードを読んでいると、 Stringの処理はかなり頻繁に出てきます。

そんなときは、 まず処理の目的を見ると分かりやすくなります。

コードを見るときの視点

equals()
→ 文字列を比較している

substring()
→ 文字列の一部を取り出している

split()
→ 区切って配列にしている

StringBuilder
→ 文字列を組み立てている

trim()
→ 前後の空白を処理している

「このStringは、何のために加工されているのか?」

という視点でコードを見ると、 単純な文字列処理でも意味が見えやすくなります。

今回のポイント

Stringは、 Javaで文字列を扱うための基本的なクラスです。

覚えておきたいこと

equals()
→ 文字列の内容を比較する

length()
→ 文字列の長さを取得する

substring()
→ 文字列の一部を取り出す

split()
→ 文字列を分割する

StringBuilder
→ 文字列を組み立てる

そして、 Stringについて少し踏み込むと、

String immutable
String Pool 文字列リテラルを共有する仕組み
intern() String Poolを利用する仕組み

という仕組みがあります。

ただ、 最初からすべて覚える必要はありません。

まずは「文字列をどう比較し、どう加工するか」を理解する。

そのうえで、 実際のコードで必要になったときに Stringの内部的な仕組みを掘っていけば十分です。