【Java】 Stringのおさらい
Stringのおさらい。知らなかった仕様もあったので油断ならない。
※ 一部省略している部分もある
コンストラクタ
- 引数なし
new String(); // ""
- バイト配列
byte[] bytes = "abcde".getBytes(); new String(bytes); // abcde new String(bytes, 1, 2); // bc (範囲外を指定するとStringIndexOutBoundsException)
- 文字配列
char[] chars = { 'x', 'y', 'z' }; new String(chars); // xyz new String(chars, 2, 1); // z (範囲外を指定するとStringIndexOutBoundsException)
- Unicodeポイント配列
int[] points = { 97, 98, 99 }; new String(points, 0, 3); // abc (範囲外を指定するとStringIndexOutBoundsException)
- String
new String("abc");
- StringBuffer
StringBuffer sb = new StringBuffer("abc"); new String(sb); // abc
- StringBuilder
StringBuilder sb = new StringBuilder("abc"); new String(sb); // abc
staticメソッド
- copyValueOf
String#valueOfと同じ
char[] chars = { 'x', 'y', 'z' }; String.copyValueOf(chars); // xyz String.copyValueOf(chars, 0, 2); // zy
- format
Localeを省略した場合、Locale#getDefaultの値が使用される。
String.format("%x", 255); // ff (%xは16進数) String.format(Locale.JAPAN, "%tB", LocalDate.of(2017, 7, 1)); // 7月 String.format(Locale.US, "%tB", LocalDate.of(2017, 7, 1)); // July
- join
区切り文字で結合する。
String.join("/", "a", "b", "c"); // a/b/c
インスタンスメソッド
- charAt
指定されたインデックスのcharを返す。インデックス外の値を指定するとStringIndexOutOfBoundsException
が発生する。
"abc".charAt(1); // b
- compareTo
2つの文字列を辞書的に比較する
"a".compareTo("A"); // 32 // 大文字と小文字の区別なしで比較する "a".compareToIgnoreCase("A"); // 0
- concat
指定された文字列を最後に連結する
"abc".concat("xyz"); // abcxyz
- contains
指定されたchar値のシーケンスを含む場合trueを返す
"abc".contains("bc"); // true "abc".contains("ac"); // false
- contentEquals
指定されたCharSequence, StringBuiler, StringBufferを比較する
"abc".contentEquals("bc"); // false "abc".contentEquals("abc"); // true "abc".contentEquals(new StringBuilder("abc")); // true "abc".contentEquals(new StringBuilder("ABC")); // false "abc".contentEquals(new StringBuffer("abc")); // true
- indexOf
指定された文字、部分文字列が最初に出現するインデックスを返す。無ければ-1を返す。
// 文字 "abcabc".indexOf('c'); // 2 // 部分文字列 "abcabc".indexOf("bc"); // 1 // 指定されたインデックス以降から探す // 対象の文字列の長さより大きいまたは負の数を指定してもStringIndexOutBoundsExceptionは発生しない "abcabc".indexOf("c", 2); // 2 "abcabc".indexOf("c", 3); // 5
- lastIndexOf
指定された文字、部分文字列が最後に出現するインデックスを返す。無ければ-1を返す。
"abcabc".lastIndexOf('c'); // 5 "abcabc".lastIndexOf("bc"); // 4 // 指定されたインデックスから先頭方向に探す // 対象の文字列の長さより大きいまたは負の数を指定してもStringIndexOutBoundsExceptionは発生しない "abcabc".lastIndexOf("c", 5); // 5 "abcabc".lastIndexOf("c", 4); // 2
- intern
文字列オブジェクトの正準表現を返す。使い所が謎。いつか調べる。
String hoge1 = new String("hoge"); String hoge2 = new String("hoge"); System.out.println(hoge1.intern() == hoge2.intern()); // true; System.out.println(hoge1.intern() == hoge2); // false System.out.println(hoge1 == hoge2); // false String fuga1 = "fuga"; String fuga2 = "fuga"; System.out.println(fuga1.intern() == fuga2.intern()); // true System.out.println(fuga1.intern() == fuga2); // true System.out.println(fuga1 == fuga2); // true
- replace
文字列の置換を行い、置換後の文字列を返す。replaceFirstを除き、すべてが置換対象。
"abcabc".replace('c', 'X'); // abXabX // 正規表現に一致する部分文字列を置換 "abcabc".replace("bc", "Y"); // aYaY "abcabc".replaceAll("abc", "Z"); // ZZ // // 正規表現に一致する最初の部分文字列を置換 "abcabc".replaceFirst("abc", "FIRST"); // FIRSTabc
- split
指定された正規表現に一致する位置で分割する。limitパラメータは適用回数を制御する。
"aXbXcX".split("X"); // {"a", "b", "c"} // limitパラメータn > 0 の場合、最大n-1回適用される "aXbXcX".split("X", 1); // {"aXbXcX"} "aXbXcX".split("X", 2); // {"a", "bXcX"} // limitパラメータn < 0 の場合、適用回数と配列の長さは制限されない "aXbXcX".split("X", -1); // {"a", "b", "c", ""} // limitパラメータn = 0 の場合、適用回数と配列の長さは制限されないが、後続の空の文字列は破棄される "aXbXcX".split("X", 0); // {"a", "b", "c"}
- substring
部分文字列を返す。指定されたインデックスが負の数または文字列の長さより大きい値を指定した場合は、StringIndexOutBoundsException
が発生する。
"abcde".substring(2); // c "abcde".substring(3, 4) ; d
- trim
先頭と末尾の空白を削除された文字列を返す。文字コード「¥u0000 〜 ¥u0020」の範囲にある文字が削除される。¥t, ¥r, ¥nなどが含まれる。
" abc ".trim(); // abc "\ta b c\r\n".trim(); // a b c "a\tb\tc".trim(); // a b c