文字列のメソッド
ここでは文字列に対して行う代表的なメソッドを学ぶ。
個別のメソッドを覚えられるのがベストではあるが、文字列に対してどういう操作ができたか、何ができるのかを理解しておくのが大事かと思う。したいことに対してできることが分かっていれば、調べればなんとかなる。(現場を知らない人間が言ってるので、問題ありと思った方はご指摘お願いします)
文字列調査
| 操作 | メソッド定義 |
|---|---|
| 内容が等しいか調べる | public boolean equals(Object o) |
| 大文字/小文字を区別せず 内容が等しいか調べる |
public boolean equalsIgnoreCase(String s) |
| 文字列長を調べる | public int length() |
| 空文字か(長さが0か)を調べる | public boolean isEmpty() |
caseは業界として大文字、小文字の区別を指すらしい。ちなみに日常的な英会話ではこの意味でそのまま使うと問題があるようなので、日常会話ではcase-sensitiveという言葉で大文字、小文字の区別を表現するみたい。
ここでのlengthはメソッドであるため、()が必要。
これまで配列で出てきたlengthはプロパティであるため、()は不要。String s1 = "スッキリjava"; System.out.println("s1の長さは" + s1.length() + "です"); int[] array = array[3]; for (i = 0; i < array.length; i++) { //以下省略
文字列の検索
| 操作 | メソッド定義 |
|---|---|
| 文字列の一部に指定した文字列sを 含むか調べる |
public boolean contains(String s) |
| 指定した文字列sで始まるかを調べる | public boolean startsWith(String s) |
| 指定した文字列sで終わるかを調べる | public boolean endsWith(String s) |
| 指定した文字ch(または文字列str)が 最初に登場する位置を調べる |
public int indexOf(int ch) public int indexOf(String str) |
| 指定した文字ch(または文字列str)を 文字列の後ろから検索して 最初に登場する位置を調べる |
public int lastIndexOf(int ch) public int lastIndexOf(String str) |
indexOfやlastIndexOfのメソッドは文字列の先頭位置を0として、文字または文字列が見つかったらその位置を、見つからなかった場合は-1を返す
文字列の切り出し
| 操作 | メソッド定義 |
|---|---|
| 指定位置の1文字を切り出す | public char charAt(int index) |
| 指定位置から始まる文字列を 任意の長さだけ切り出す |
public String substring(int index) public String substring(int index, int endIndex) |
文字列変換のメソッド
| 操作 | メソッド定義 |
|---|---|
| 大文字を小文字に変換 | public String toLowerCase() |
| 子文字を大文字に変換 | public String toUpperCase() |
| 前後の空白を除去 | public String trim() |
| 指定した文字を置換する | public String replace(String before, String after) |
trimは全角スペースは除去されないことに注意!
文字列の連結
既知の文字列連結の手法として以下の例のように"+"で文字列同士を簡単に連結することができる。
String s1 = "abc", s2 = "def";
System.out.println(s1 + s2);
//出力結果
//abcdef
今回新たに文字列を連結する手法として、StringBuilderクラスを用いた連結を学んだ。以下の比較表でわかるように一長一短の側面があるため、その時々で最適な手段を選択できることが望ましい。
| 比較項目 |
String による連結(+ 演算子など) |
StringBuilder による連結(.append()) |
|---|---|---|
| オブジェクトの可変性 |
不変(Immutable) 変更のたびに新しいオブジェクトが生成される。 |
可変(Mutable) 同じオブジェクト内のバッファを書き換える。 |
| 処理速度(大量連結時) |
遅い ループ等で何度も連結すると、メモリコピーが多発する。 |
非常に高速 メモリの再確保が最小限に抑えられる。 |
| メモリ効率 |
悪い ゴミ(破棄される中間オブジェクト)が大量に発生する。 |
良い 内部の文字配列を再利用するため無駄がない。 |
| スレッドセーフ |
安全(Thread-Safe) 不変であるため、複数スレッドから同時に安全に共有できる。 |
安全ではない(Not Thread-Safe) ※マルチスレッド環境では StringBufferの検討が必要。 |
| コードの簡潔さ |
非常に簡潔str1 + str2 のように直感的に書ける。 |
やや冗長 インスタンス化と .append()メソッドの呼び出しが必要。 |
| 主な用途 | ・少数の文字列の連結 ・定数や設定値の管理 |
・ループ(for/while)内での大量の文字列連結 ・動的な長い文章の構築 |
使用例
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("Java");
}
String s = sb.toString();
System.out.println(s);
}
}
ここでイミュータブル、ミュータブルの話が出てきたのでこれを機にしっかり学んでおこうと思うので、今回は割愛して後ほどまとめます。とりあえずここでのポイントは
イミュータブルオブジェクト→変数をプログラムとして書き換えても以前の変数のデータがなくならない。メモリを圧迫ミュータブル→変数をプログラムとして書き換えたら、以前の内容のデータはなくなる- イミュータブル → 変数とは別にこのオブジェクトのデータは変更ができない
- ミュータブル → イミュータブルとは違い、このオブジェクトはデータが変わりうるものであり、不変ではない
- Stringインスタンスはイミュータブル(不変)なオブジェクトである