文字列の比較

Javaで開発しているときは、文字列を比較するときに == ではなくequals()メソッドで比較するようにしていた。.NETでも String.Equalsメソッド がある。Equalsメソッドを使わないといけないのか?とSさんに質問したら、柳臣一さんの blog : .NET や C# がメインの blog 文字列比較のパフォーマンスという記事を探してくださった。記事によると、

1. s1.Equals(s2) 2. String.Equals(s1, s2) 3. s1 == s2

の三つでは、3 は 2 を呼び、2 は 1 を呼ぶ、という実装になっているそうです。というわけで、パフォーマンスが違うだけでどれを使っても結果は同じということ。コードのわかりやすさを考えると、3の書き方に統一しようと思っている。

ついでにJavaのもおさらい。

Javaでは文字列比較ではequals()メソッドを使わないといけない。 SUGAI, Manabuさんの Java 入門 | 文字列 を参照すると、

文字列はクラス java.lang.String 型のれっきとしたオブジェクトなのですが、頻繁に使うので、プリミティブ型と同様の記法も許されており、その場合は、equals() と == が、ある程度までは、同じ結果を返すような仕組みを持っています。

==はプリミティブ型の比較に使って、equals()はオブジェクトの比較をする。 String型はオブジェクトのクラスなのだが、頻繁に使われるため、プリミティブ型のように使えるようになっている。でも比較するときはequals()を使う。

文字列を擬似プリミティブ型として宣言してみる。 [java]public class StrTest { public static void main(String strArgs) { String a = "文字列"; String b = "文字列"; System.out.println("a.equals(b) ->" + a.equals(b)); System.out.println("a == b -> " + (a == b)); } }[/java] 出力は

a.equals(b) -> true a == b -> true

次にオブジェクトとして宣言してみる。 [java]public class StrTest { public static void main(String strArgs) { String a = new String("文字列"); String b = new String("文字列"); System.out.println("a.equals(b) -> " + a.equals(b)); System.out.println("a == b -> " + (a == b)); } }[/java] 出力は

a.equals(b) -> true a == b -> false

SUGAIさんの記述を借りると、

通常のオブジェクトの作成と同じ形式で作った文字列オブジェクト a,b の場合は、 == では、保持している値自身が比較されるので、別のオブジェクトの参照同士を比較したことになり、 false が戻ります。 equals() では、参照しているオブジェクトの実体が比較されるので、今の場合は true が戻ります。