Javaの文字列(String)クラスについて


Javaで文字列を扱うStringクラスとStringBuilderクラスの紹介です。

🐹 Stringクラス

Javaで文字列を扱う基本的なクラスで、読み込み専用(イミュータブル)です。変更可能な文字列を使いたい場合はStringBuilderクラスを使います。

String s = "0123456789";

ダブルクオート(")で囲んだ表記を文字列リテラルと呼びます。

よく使うメソッド

メソッド 意味
charAt(位置) 指定した位置の文字を取得
compareTo(比較する文字列) 2つの文字列の比較。大文字小文字を区別
compareToIgnoreCase(比較する文字列) 2つの文字列の比較。大文字小文字は無視
contains 指定した文字列を含むかの判定
equals 指定した文字列が同じ内容の文字列かを調べる
indexOf(文字) 指定した文字を検索してそのインデックスを返す
isEmpty 空文字かを調べる
replace(変更した文字列, 変更後の文字列) 文字列の置き換え
substring(開始, 終了) 部分文字列を取得
trim 文字列の前後にあるスペース、タブ文字、改行を除去
valueOf(数字) 数字から文字列への変換

詳細は「String (Java Platform SE 8 )」を参照。

文字列の配列を結合:String.join

Java 8のString.join(CharSequence delimiter, Iterable element)を使うと文字列をスッキリと結合できます。

String[] stringArray = { "a", "b", "c", "d" };
String delimiter = ", ";
System.out.println(String.join(delimiter, stringArray));

nullと文字列の結合

nullとString型を+演算子で結合すると"null"という文字列に置き換えて文字列結合を行います。

System.out.println(null + " hoge"); //=> "null hoge"

🎳 StringBuilderクラス

StringBuilderクラスは書き換え可能な文字列を扱うクラスです。

StringBuilder sb = new StringBuilder("0123456789");

Stringクラスは文字列を変更するたびにオブジェクトを生成するため、大量の書き換えを行うとコストがかかります。
そのため文字列の書き換えを行う場合はStringBuilderクラスを使うべきです。

よく使うメソッド

メソッド 意味
append(文字列) 指定した文字列を追加
delete(開始、終了) 指定した部分の文字列を削除
indexOf(文字) 指定した文字を検索してそのインデックスを返す
insert(オフセット, 文字列) 指定した位置に文字列を挿入
replace(オフセット, 文字列) 指定した位置の文字を置き換え
replaceAll(変更したい文字列, 変更後の文字列) 指定した文字列を別の文字列に置き換え。置き換え語の新しいStringを返す
setCharAt(位置、文字) 指定した位置に文字をセット
substring(開始, 終了) 部分文字列を取得
toString() Stringクラスに変換

詳細は「StringBuilder (Java Platform SE 8 )」を参照。

🐞 String/StringBuilderの比較

Stringの比較

Stringどうしの比較はequals(文字列)メソッドを使います。

// equalsで比較すると同じ値と判定
new String("test").equals("test"); //=> true

// == では異なる値と判定
new String("test") == "test"; //=> false

// こちらも falseを返す
new String("test") == new String("test"); //=> false

// 以下の場合はコンパイラが同じ参照をみているためtrueを返す
"test" == "test" //=> true

StringBuilderの比較

  • StringとStringBuilderの比較 => contentEquals(文字列)
  • StringBuilderどうしの比較 => toStringメソッドでStringに変換して比較
StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
sb1.toString().contentEquals(sb2); //=> true

🍣 文字列から数値への変換

変換メソッド 概要
Integer.parseInt(文字列) Stringからintへの変換
Double.parseDouble(文字列) Stringからdoubleへの変換

数値に変換でいきないような文字列が含まれる場合は、java.lang.NumberFormatException例外が発生します。

🤔 数値などから文字列への変換

Stringクラスのformatメソッドで文字列の書式化を行えます。

// %s は hoge を文字列とし、%d は 2を数値として書式化
String s = String.format("%s -> %d", hoge, 2);
System.out.println(s); //=> hoge -> 2

詳細は「Formatter (Java Platform SE 8 )」を参照。

🐡 ReplaceRelaceAllについて

  • replaceは第一引数を文字列と解釈して置き換えをしてくれる
  • replaceAllは第一引数を正規表現と解釈して置き換える
String str = "abc.def.";
System.out.println("Result: " + str.replace(".", "1")); // => abc1def1
System.out.println("Result: " + str.replaceAll(".", "1")); //=> 11111111

😀 補足:StringStringBuilderの内部構造

Stringが内部的にはcharの配列なのに対して、StringBuilderは内部にバッファを持った文字列を扱うためのクラスです。

StringBuilderのバッファはデフォルトでは16文字分を持っています。引数なしのコンストラクタは次のような定義です。

public StringBuilder() {
super(16);
}

デフォルトではこの16文字分のchar配列のインスタンスを作ります。

👽 補足:コンスタントプール

プログラム中で複数文字列が使われるため、個別にStringインスタンスを生成するのではなく、定数用のメモリ空間を作ってそこにString変数を代入します。もし同じ文字列リテラルがプログラム内に再登場した場合は定数用のメモリ空間の参照を使い回します。このしくみを「コンスタントプール」と呼びます。

😼 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍