文字列操作について学ぶ重要な問題です。
問題
次のJavaプログラムを実行したときの出力を選びましょう。
public class StringExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2 ? "Same" : "Different");
System.out.println(str1.equals(str2) ? "Equal" : "Not Equal");
}
}
選択肢
- A. Same, Equal
- B. Same, Not Equal
- C. Different, Equal
- D. Different, Not Equal
答えと解説
回答を見る
答え
C. Different, Equal
解説
基本説明:
Javaの文字列比較に関する基礎を理解しておくことは重要です。
==
演算子は、オブジェクトの参照を比較します。
一方、equals()
メソッドは文字列の内容そのものを比較します。
これらの違いを知らないと、予想と異なる結果が出ることがあります。
誤答理由:
多くの人が、==
とequals()
が同じ機能だと思いがちです。
しかし、前述の通り==
は参照の比較であり、equals()
は実際の値の比較です。
この違いを理解しないと、選択肢AやBのように誤った解答を選んでしまうことがあります。
つまずきポイント:
初心者がつまずくポイントとして、new
キーワードを用いた文字列の作成と
リテラルとして作成した文字列の違いが挙げられます。
リテラルは、Java VMが文字列プールを利用して効率を上げますが、
new
キーワードを使用すると、常に新しいオブジェクトが生成されます。
発展知識:
intern()
メソッドを利用することで、文字列のプールにある等価な文字列を取得することができます。
一般的には文字列リテラルに.intern()
を呼び出すと、
既存のプール内の文字列を再利用します。
これにより、==
での比較もtrue
となるケースを実現できます。
文字列操作の最適化に役立つ知識です。