今回はJavaの文字列の連結と比較について見ていこう。前回の記事では文字列の基本操作を学んだよね。
Stringの基本操作をマスターしよう | ToolDocs
文字列はJavaプログラミングで頻繁に使うから、しっかりマスターしておこう。
文字列の連結は、複数の文字列を一つにまとめることだよ。Javaで文字列を連結する方法はいくつかあるから、順番に見ていこう。
+ 演算子を使う
一番簡単でよく使うのが、+(プラス)演算子を使う方法だ。数字の足し算と同じように使えるよ。
Java
String str1 = "Hello";
String str2 = "World";
String result = str1 + str2; // "HelloWorld" になる
System.out.println(result);
String str3 = "Java";
String str4 = "is";
String str5 = "fun!";
String message = str3 + " " + str4 + " " + str5; // "Java is fun!" になる
System.out.println(message);
数値と文字列を+でつなぐこともできるよ。この場合、数値は自動的に文字列に変換されるんだ。

paizaで実行した結果
Java
String item = "りんご";
int price = 100;
String totalMessage = item + "の値段は" + price + "円です。"; // "りんごの値段は100円です。"
System.out.println(totalMessage);
concat() メソッドを使う
Stringクラスには、文字列を連結するためのconcat()メソッドもあるよ。これは一つの文字列に別の文字列を追加するイメージだね。
Java
String strA = "Good";
String strB = "Morning";
String combined = strA.concat(strB); // "GoodMorning" になる
System.out.println(combined);
// 複数連結したい場合は、こんな風に続けることもできるけど、+演算子の方が分かりやすいかな
String multiCombined = strA.concat(" ").concat(strB).concat("!"); // "Good Morning!" になる
System.println.println(multiCombined);

paizaで実行した結果
StringBuilder または StringBuffer を使う(パフォーマンス重視なら)
たくさんの文字列を繰り返し連結する場合、+演算子やconcat()メソッドを何度も使うと、実は効率が悪くなることがあるんだ。これは、文字列が**不変(immutable)**という性質を持っているからなんだ。
文字列が不変というのは、一度作られた文字列は内容を変更できないということ。+演算子などで連結するたびに、新しい文字列オブジェクトが作られてしまうんだ。たくさんの文字列を連結すると、そのたびに新しいオブジェクトが作られてメモリの無駄遣いになったり、処理が遅くなったりする可能性があるんだよ。
そこで登場するのが、StringBuilderやStringBufferだ。これらは**可変(mutable)**な文字列を扱うためのクラスで、文字列の内容を効率よく変更したり追加したりできるんだ。
StringBuilder: シングルスレッド(一つの処理の流れ)で使う場合に適している。処理が速い。StringBuffer: マルチスレッド(複数の処理が同時に動く)で使う場合に適している。安全だけど、StringBuilderより少し遅い。
初心者のうちはStringBuilderを使うことが多いかな。
Java
StringBuilder sb = new StringBuilder();
sb.append("今日の天気は");
sb.append("晴れです。");
sb.append("とても気持ちが良いですね!");
String finalString = sb.toString(); // 最後にString型に変換する
System.out.println(finalString); // "今日の天気は晴れです。とても気持ちが良いですね!"
たくさんの文字列をループで連結する場合なんかは、StringBuilderを使うとパフォーマンスが大きく改善されるよ。
Java
// 例えば、1から100までの数字を連結する場合
// +演算子だと非効率
// String result = "";
// for (int i = 1; i <= 100; i++) {
// result += i;
// }
// StringBuilderを使うと効率的
StringBuilder efficientSb = new StringBuilder();
for (int i = 1; i <= 100; i++) {
efficientSb.append(i);
}
String numbers = efficientSb.toString();
System.out.println(numbers.substring(0, 50) + "..."); // 長いので一部だけ表示

paizaで実行した結果
文字列の比較:同じかどうか調べる
次に、二つの文字列が同じ内容かどうかを比較する方法を見ていこう。これもよく使う操作だから、しっかり理解しておこうね。
== 演算子を使う(これは避けるべき!)
まず注意点! 文字列の比較に==(イコール二つ)演算子を使っちゃダメだよ。
==演算子は、プリミティブ型(intやbooleanなど)の比較には使えるんだけど、オブジェクト(Stringもオブジェクトだよ)に対して使うと、内容が同じかどうかではなく、メモリ上の「場所」が同じかどうかを比較してしまうんだ。
例を見てみよう。
Java
String s1 = "apple";
String s2 = "apple"; // s1と同じ内容
String s3 = new String("apple"); // new Stringで新しいオブジェクトを作る
String s4 = new String("apple"); // new Stringで新しいオブジェクトを作る
System.out.println(s1 == s2); // true になることが多いけど、保証されない(Javaの最適化による)
System.out.println(s3 == s4); // false になる(メモリ上の場所が違うから)
System.out.println(s1 == s3); // false になる
s1 == s2がtrueになるのは、Javaが同じ文字列リテラルを効率化のために同じメモリ領域に置くことがあるからなんだ。でも、new String()を使って明示的に新しいオブジェクトを作ると、たとえ内容が同じでもメモリ上の場所は別物になるからfalseになるんだよ。
だから、文字列の内容を比較したい場合は、絶対に==演算子を使わないようにしよう。

paizaで実行した結果
equals() メソッドを使う(これが正しい!)
文字列の内容が同じかどうかを比較するには、equals()メソッドを使うのが正しい方法だ。
Java
String strA = "Java";
String strB = "Java";
String strC = "java"; // 小文字
System.out.println(strA.equals(strB)); // true になる(内容が同じ)
System.out.println(strA.equals(strC)); // false になる(大文字と小文字を区別する)
String strD = new String("Java");
System.out.println(strA.equals(strD)); // true になる(メモリ上の場所が違っても内容は同じ)
equals()メソッドは、大文字と小文字を区別して比較するよ。

paizaで実行した結果
equalsIgnoreCase() メソッドを使う(大文字小文字を区別しない場合)
もし、大文字と小文字を区別せずに文字列を比較したい場合は、equalsIgnoreCase()メソッドを使うと便利だよ。
Java
String passwordInput = "Password123";
String storedPassword = "password123";
System.out.println(passwordInput.equals(storedPassword)); // false
System.out.println(passwordInput.equalsIgnoreCase(storedPassword)); // true
パスワードの比較なんかで、「大文字・小文字は問わない」というルールがある場合に役立つね。

paizaで実行した結果
まとめ
今回はJavaにおける文字列の連結と比較について学んだよ。
- 文字列の連結:
+演算子が一番手軽でよく使われる。concat()メソッドも使える。- たくさんの文字列を効率的に連結したい場合は、
StringBuilder(シングルスレッド)やStringBuffer(マルチスレッド)を使うと良い。
- 文字列の比較:
- 絶対にしてはいけないのが
==演算子を使った比較。これはメモリ上の場所を比較してしまう。 - 正しいのは
equals()メソッドを使った比較。これは文字列の内容を比較する(大文字小文字を区別する)。 - 大文字と小文字を区別せずに比較したい場合は
equalsIgnoreCase()メソッドを使う。
- 絶対にしてはいけないのが
文字列の操作はプログラミングの基本中の基本だから、しっかりとマスターして、次のステップに進んでいこう!


コメント