[Java] `String` などの文字列に関するメモ

わかりやすいJava_オブジェクト指向編を読んで勉強中。。

String#indexOf

文字の位置を取得する

String s = "foobar2000";
System.out.println(s.indexOf('o'));
System.out.println(s.indexOf('o', 2));
System.out.println(s.indexOf('o', 3));
System.out.println(s.indexOf("oo"));
System.out.println(s.indexOf("oo", 2));
System.out.println(s.indexOf("oo", 3));

結果

1
2
-1
1
-1
-1

一致する文字/文字列が見つからない場合は -1 が返ってくる。

String#substring

String test = "testString";
System.out.println(test.substring(4));
System.out.println(test.substring(4, 8));
try {
  System.out.println(test.substring(100));
} catch (Exception e) {
  e.printStackTrace();
}

結果

String
Stri
java.lang.StringIndexOutOfBoundsException: String index out of range: -90
  at java.lang.String.substring(String.java:1958)
  at java.lang.String.substring(String.java:1925)
  at jp.fernweh.main.StudyJava.main(StudyJava.java:22)

引数が2つの場合は、どっちも文字の位置を入れる。2つ目の引数は 文字の長さではない。

文字列結合

  • String+ で結合するとパフォーマンス的にどうこうとか解説してるサイトがあるけど、ループ内とかで実行するのでなければコンパイラが最適化してくれるっぽい(StringBuilderで連結するように勝手にしてくれるらしい)。
  • StringBuffer, StringBuilder は可変長文字列を扱うクラス。
  • StringBuffer は同期、StringBuilder は非同期実行される。

スレッドセーフな可変長文字列を使いたい場合は StringBuffer を使用する。 まぁ特別速さが求められるものでなければ StringBuffer を使っておけばいい気がする。

String s;
s = "foo".concat("bar").concat("2000");
System.out.println(s);

int capacity = 5;
StringBuffer sb = new StringBuffer(capacity);
sb.append('X');
sb.append(true);
s = sb.toString();
System.out.println(s);

sb.append("hogehoge");
System.out.println(sb);

結果

foobar2000
Xtrue
Xtruehogehoge

String#toUpperCase, String#toLowerCase

String s = "HOGEpiyo";
System.out.println(s.toUpperCase());
System.out.println(s.toLowerCase());

結果

HOGEPIYO
hogepiyo

String#trim

String s = " \f \r\n HOGE \n piyo \t ";
System.out.println(s.trim());

結果

HOGE
 piyo

文字列両端の空白を取り除く。 空白(半角スペース)だけじゃない。 両端ではなく片方だけとかは正規表現で実装しないとダメみたい。

String#replace

String s = "foo";
s = s.replace("foo", "bar");
System.out.println(s + "!");
s = s.replace("", "-");
System.out.println(s);

結果

bar!
-b-a-r-

文字列の比較

String s1, s2;
s1 = "Fernweh8000";
s2 = "Fernweh8000";

System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println();

s2 = new String(s1);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println();

結果

true
true

false
true

ほかにも compareTo だとか比較メソッドが存在する。

フォーマット文字列

結果

123456789           ←に空白があるよ
%n は環境依存の改行文字を出力するよ
+012,345
(000034,567)
-056,789
b
12.340000 56.8

CharSequence インターフェイス

StringStringBuilfer などの char 文字列を扱うことのできるクラスが実装しているインターフェイス

charAt, subSequence, lengthメソッドを持つ

メモ

Share
関連記事