weblog

技術的なメモ置き場。

【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)
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