【Java】文字列操作
参照
length
length
は、文字列の文字数を返します。
String str = "abcdef";
int l = str.length(); //6
isEmpty
isEmpty
は、文字列が空文字(""
)であるかを判定し、その結果を真偽値で返します。
String str1 = "";
boolean r1 = str1.isEmpty(); //true
String str2 = "abc";
boolean r2 = str2.isEmpty(); //false
比較
equals
文字列を比較する場合、等価演算子(==
)ではなく、 equals
を使用します。
文字列だけの話ではないのですが、等価演算子は値の比較でなくアドレスの比較になります。
またリテラルと変数を比較する場合は、リテラルのequals
の引数に変数を設定します。
これは、仮にstr1.equals("abc")
として場合に、str1 = null
だとNullPointerException
が発生してしまうからです。
String str1 = "abc";
boolean r1 = str1 == "abc"; // false
boolean r2 = "abc".equals(r1);
compareTo
文字列はcompareTo
によって比較できます。
文字列の比較には文字コードが使用され、その大小関係を数値として返します。
比較対象より小さい場合は負、大きい場合は正、同じ場合は0
を返します。
String str1 = "abc";
String str2 = "def";
boolean r1 = str1.compareTo(str2); // -3
boolean r2 = str2.compareTo(str1); // 3
maches
maches
は、文字列が指定された正規表現と一致するかを判定し、その結果を真偽値で返します。
正規表現については割愛します。
String str = "abc";
boolean r1 = str.matches("^[a-z]+$"); //true
boolean r2 = str.matched("^[A-Z]+$"); //false
連結
+
最もメジャーな方法として、+
を用いる方法があります。
しかし、パフォーマンスに問題があるため、多くのデータを連結する場合には使用しないほうが良いです。
String str = "abc";
str = str + "def"; //"abcdef"
concat
concat
は文字列を連結するメソッドであり、+
よりもパフォーマンスは良いです。
それでも次に説明するStringBuilder
には劣ります。
String str = "abc";
str = str.concat("def");
StringBuilder
StringBuilder
は文字列を連結するように定義されたクラスです。
通常、多くのデータを連結する場合にはこれを使用します。
StringBuilder sb = new StringBuilder();
sb.append("abc");
sb.append("def");
String str = sb.toString();
検索
contains
contains
は、対象の文字列が含まれるかを検索し、その結果を真偽値で返します。
String str = "abcdefgabcdefg";
boolean r1 = str.contains("cd"); //true
boolean r2 = str.contains("cc"); //false
indexOf, lastIndexOf
indexOf
とlastIndexOf
は、対象の文字列が含まれるかを検索し、最初にヒットしたインデックスを返します。
対象がない場合は-1
を返します。
ふたつのメソッドの違いは、先頭から検索するか、末尾から検索するかです。
またindexOf
のみ、第二引数に検索開始インデックスを指定できます。
String str = "abcdefgabcdefg";
int idx1 = str.indexOf("cd"); //2
int idx2 = str.indexOf("cd", 3); //9
int idx3 = str.lastIndexOf("cd"); //9
int idx4 = str.indexOf("cc"); //-1
編集
replace
replace
は指定した文字と一致する部分をすべて別の文字に置換します。
String str1 = "abcdefgabcdefg";
String str2 = str1.replace("abc", "xyz"); //"xyzdefgxyzdefg"
replaceAll, replaceFirst
replaceAll
とreplaceFirst
は、正規表現に一致する部分を別の文字に置換します。
replaceAll
は全てを置換し、replaceFirst
は一致した最初の文字のみ置換します。
String str1 = "abcdefgabcdefg";
String str2 = str1.replaceAll("[a|d]", "X"); //"XbcXeggXbcXefg"
String str3 = str1.replaceFirst("[a|d]", "X"); //"Xbcdefgabcdefg"
substring
substring
は、指定したインデックスの範囲の文字列を切り取ります。
インデックスの指定が 1 つの場合は、そのインデックス以降の全ての文字列を切り取ります。
String str1 = "abcdefg";
String str2 = str1.substring(2, 5); //"cde"
String str3 = str1.substring(4); //"efg"
split
split
は正規表現に一致する文字で分割し、文字列配列を返します。
String str = "abc,def,ghi";
String[] strAry = str.split(",");
trim
trim
は文字の先頭、末尾の半角スペースを削除します。
String str1 = " abc def ";
String str2 = str1.trim(); //"abc def"
toUpperCase, toLowerCase
toUpperCase
、toLowerCase
はそれぞれ英字を大文字、小文字に変換します。
String str1 = "abcDEF";
String str2 = str1.toUpperCase(); //"ABCDEF"
String str3 = str1.toLowerCase(); //"abcdef"
変換
valueOf
valueOf
はint
などの基本データ型をString
に変換するstatic
なメソッドです。
String str1 = String.valueOf(10); //"10"
String str2 = String.valueOf(true); //"true"
format
format
は基本データ型などを指定したフォーマットの文字列に変換するstatic
なメソッドです。
例えば10
を"0010"
と変換する場合は次のようにします。
String str = String.format("%04d", 10);
フォーマットには次のようなものがあります。
フォーマット | 値 | 出力 | 説明 |
---|---|---|---|
%d | 10 | "10" | 10 進数 |
%o | 10 | "12" | 8 進数 |
%x | 20 | "14" | 16 進数 |
%03d | 10 | "010" | 先頭ゼロ詰め |
%3d | 10 | " 10" | 先頭空白詰め |
%-3d | 10 | "10 " | 末尾空白詰め |
%,d | 123456 | "123,456" | 3 桁カンマ区切り |
%f | 12.56 | "12.560000" | 浮動小数点 |
%.0f | 12.56 | "12" | 小数点以下切り捨て |
%.1f | 12.56 | "12.6" | 小数点第二位を四捨五入 |
%s | "abc" | "abc" | 文字列 |
%4s | "abc" | " abc" | 先頭空白詰め |
%-4s | "abc" | "abc " | 末尾空白詰め |