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" }; |
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で比較すると同じ値と判定 |
StringBuilderの比較
- StringとStringBuilderの比較 =>
contentEquals(文字列)
- StringBuilderどうしの比較 =>
toString
メソッドでString
に変換して比較
StringBuilder sb1 = new StringBuilder("abc"); |
🍣 文字列から数値への変換
変換メソッド | 概要 |
---|---|
Integer.parseInt(文字列) |
String からint への変換 |
Double.parseDouble(文字列) |
String からdouble への変換 |
数値に変換でいきないような文字列が含まれる場合は、java.lang.NumberFormatException
例外が発生します。
🤔 数値などから文字列への変換
String
クラスのformatメソッドで文字列の書式化を行えます。
// %s は hoge を文字列とし、%d は 2を数値として書式化 |
詳細は「Formatter (Java Platform SE 8 )」を参照。
🐡 Replace
とRelaceAll
について
replace
は第一引数を文字列と解釈して置き換えをしてくれるreplaceAll
は第一引数を正規表現と解釈して置き換える
String str = "abc.def."; |
😀 補足:String
とStringBuilder
の内部構造
String
が内部的にはchar
の配列なのに対して、StringBuilder
は内部にバッファを持った文字列を扱うためのクラスです。
StringBuilder
のバッファはデフォルトでは16文字分を持っています。引数なしのコンストラクタは次のような定義です。
public StringBuilder() { |
デフォルトではこの16
文字分のchar
配列のインスタンスを作ります。
👽 補足:コンスタントプール
プログラム中で複数文字列が使われるため、個別にStringインスタンスを生成するのではなく、定数用のメモリ空間を作ってそこにString変数を代入します。もし同じ文字列リテラルがプログラム内に再登場した場合は定数用のメモリ空間の参照を使い回します。このしくみを「コンスタントプール」と呼びます。
😼 参考リンク
- 改訂2版 パーフェクトJava
- Stringのメソッドを適当にまとめてみる - マイペースなプログラミング日記
- How do I compare strings in Java?
- あなたのJavaコードをスッキリさせる、地味に便利な新API 10選(前編)
- JavaのString.replaceとString.replaceAllの違い