概要
Javaでもっともよく使う基本的なオブジェクト型はStringではないでしょうか。
Stringには便利なメソッドが多数用意されているので、それらをうまく使えるようになることはコーディングの上達に不可欠と言えます。
Stringの基本仕様
文字列を扱うクラス
言わずとも知れた文字列を扱うクラスです。
文字列を扱うための様々なメソッドが用意されています。
不変オブジェクト
Stringは不変オブジェクトです。
不変オブジェクトとは、インスタンス生成後に値の上書きが行われないオブジェクトのことです。
以下のようにStringを上書きするコードの場合、実際には新しいインスタンスが生成されています。
1 2 3 4 5 6 7 8 |
public class StringMain { public static void main(String[] args) { String first = "first"; // 初期化 first = "changed first";// 上書きではなく新しいインスタンスが生成される } } |
これを確認してみましょう。
方法として、別のString型の変数にコピーして、コピー先を変更してみます。
オブジェクト型はコピー先を修正すれば、コピー元も変更されるのが基本仕様ですが、不変オブジェクトであるStringはそうではありません。
以下では、コピー先であるcopiedはfirstの変更の影響を受けていません。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class StringMain { public static void main(String[] args) { String first = "first"; String copied = first; first = "changed first"; System.out.println("first : " + first); System.out.println("copied : " + copied); } } |
<出力結果>
first : changed first
copied : first
図解すると、以下のようになります。
これを知って何になるのかというと、Stringを大量に代入(文字列連結も含む)する処理はパフォーマンスに影響を与える可能性があるという認識を持てることです。
インスタンスの生成にはコストがかかるので、大量に連結する場合はStringBuilderクラスを使うことが推奨されています。
使い方別のメソッドまとめ
文字列の位置を取得
<indexOfメソッド>
1 2 3 4 5 6 7 |
String alphas = "abcde"; System.out.println("indexOf [a] -> " + alphas.indexOf("a")); System.out.println("indexOf [ab] -> " + alphas.indexOf("ab")); System.out.println("indexOf [e] -> " + alphas.indexOf("e")); System.out.println("indexOf [f] -> " + alphas.indexOf("f")); |
<実行結果>
indexOf [a] -> 0
indexOf [ab] -> 0
indexOf [e] -> 4
indexOf [f] -> -1
<説明>
indexOfは、一致した文字列の最初のインデックス番号を返します。
上記の例だと、[ab]が一致した最初のインデックスは、[a]の手前である「0」が返ってきます。
文字列とインデックスの位置を図解すると、以下のようになります。
[f]のように、一致する文字列が無い場合は「-1」が返ってきます。
一字のみ(char)を取得
<charAtメソッド>
1 2 3 4 5 6 |
String alphas = "abcde"; System.out.println("charAt [0] -> " + alphas.charAt(0)); System.out.println("charAt [4] -> " + alphas.charAt(4)); System.out.println("charAt [5] -> " + alphas.charAt(5)); |
<実行結果>
charAt [0] -> a
charAt [4] -> e
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
(...出力情報は省略)
<説明>
インデックスを指定すると、charを返してくれます。
ただし、文字列のインデックスを超えて指定した場合は、「StringIndexOutOfBoundsException」がスローされます。
上記だと、インデックスの5は範囲外であると表示されています。
文字列の切り出し
<substringメソッド>
1 2 3 4 5 6 7 |
String alphas = "abcde"; System.out.println("substring [0] -> " + alphas.substring(0)); System.out.println("substring [1,4] -> " + alphas.substring(1,4)); System.out.println("substring [1,5] -> " + alphas.substring(1,5)); System.out.println("substring [6] -> " + alphas.substring(6)); |
<実行結果>
substring [0] -> abcde
substring [1,4] -> bcd
substring [1,5] -> bcde
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
(...出力情報は省略)
<説明>
・引数が1つの場合
指定したインデックス以降を切り取ります。
・引数が2つの場合
1つ目がインデックス開始位置、2つ目がインデックス終了位置です。
ただし、インデックス終了位置は含まれません。
(仕様上は、指定した値から-1されています)
そのため、[1,5]の指定で最後の[e]までを取得できます。([e]のインデックス番号は4)
・存在しないインデックスを指定した場合
「StringIndexOutOfBoundsException」がスローされます。
指定可能な範囲を1つ超えているので、「-1」が表示されています。
文字列の置換
<replaceメソッド>
1 2 3 4 5 6 |
String alphas = "abcde"; System.out.println("replace [a => A] -> " + alphas.replace('a', 'A')); System.out.println("replace [a => AAA] -> " + alphas.replace("a","AAA")); System.out.println("replace [f => F] -> " + alphas.replace("f","F")); |
<実行結果>
replace [a => A] -> Abcde
replace [a => AAA] -> AAAbcde
replace [f => F] -> abcde
<説明>
引数の1つ目に指定した文字列が存在する場合、
引数の2つ目に指定した文字列に置換します。
引数の1つ目には、char型またはString型が指定できます。
char型は、シングルクウォーテーション(‘)で囲みます。
String型は、ダブルクォーテーション(“)で囲みます。
文字数の取得
<lengthメソッド>
1 2 3 4 |
String alphas = "abcde"; System.out.println("length -> " + alphas.length()); |
<実行結果>
length -> 5
<説明>
文字列数を返してくれます。
文字列の一致判定(前方一致)
<startsWithメソッド>
1 2 3 4 5 |
String alphas = "abcde"; System.out.println("startsWith [ab] -> " + alphas.startsWith("ab")); System.out.println("startsWith [bc] -> " + alphas.startsWith("bc")); |
<実行結果>
startsWith [ab] -> true
startsWith [bc] -> false
<説明>
指定した文字列が、最初から全て一致しているかの判定結果を返します。
一字でも不一致の場合はfalseになります。
文字列の一致判定(後方一致)
<endsWithメソッド>
1 2 3 4 5 |
String alphas = "abcde"; System.out.println("endsWith [de] -> " + alphas.endsWith("de")); System.out.println("endsWith [cd] -> " + alphas.endsWith("cd")); |
<実行結果>
endsWith [de] -> true
endsWith [cd] -> false
<説明>
指定した文字列が、最後まで全て一致しているかの判定結果を返します。
一字でも不一致の場合はfalseになります。
文字列の一致判定(部分一致)
<matches, containsメソッド>
下記の記事を参照
⇒【Java】文字列の完全一致と部分一致を判定する方法
変換する(大文字)
<toUpperCaseメソッド>
1 2 3 4 |
String alphas = "abcde"; System.out.println("toUpperCase -> " + alphas.toUpperCase()); |
<実行結果>
toUpperCase -> ABCDE
<説明>
文字列(英字)を全て大文字に変換します。
変換する(小文字)
<toLowerCaseメソッド>
1 2 3 4 |
String alphasUpper = "ABCDE"; System.out.println("toLowerCase -> " + alphas.toLowerCase()); |
<実行結果>
toLowerCase -> abcde
<説明>
文字列(英字)を全て小文字に変換します。
まとめ
- Stringは文字列を扱うクラスである。
- Stringは不変オブジェクトであるため、代入の際は常に新規のインスタンスが生成されている。
- Stringには便利なメソッドが多数用意されている。