« スレッドはオブジェクトとは独立した存在である | トップページ | コーディング規約とコーディングパターンは違う »

2007年1月21日 (日)

String型オブジェクトの場合、equalsでの比較より、==の方がパフォーマンスが高い

String型オブジェクトの場合、equalsでの比較より、==の方がパフォーマンスが高い

以前、オブジェクトの比較について、== と equalsメソッドの違いについて記事にしたことがある。そこで明らかになったのは、== はオブジェクトの場所の比較、equalsはオブジェクトの内容の比較、という違いだった。

さて、通常のプログラミングにおいて、最も頻繁にオブジェクトの比較が行われるのは、String型のオブジェクトだろう。
そのとき、大抵は、equalsメソッドを使用して比較が行われる。(コーディング規約でそう規定されている職場も多い)

Stringオブジェクトの比較は、その内容が等しいかどうかの判定を目的としたものがほとんとである。そうであるがゆえにequalsメソッドの使用が規約とされている。

これはオブジェクトの比較におけるルールに照らしてみると、正しい規約にみえる。
もし == を使ってしまうと、それはオブジェクトの場所の比較になってしまうからだ。

しかし、String型の場合は、通常のオブジェクトにはない性質があり、その性質のためにequalsメソッドと、== の両方でオブジェクトの内容の比較が可能なのである。

そのString型の性質とは、
String型オブジェクトの場合、同じ文字列は一つのオブジェクトが使いまわされる
という性質である。(これはJavaVMの仕様でもある)
ただし、これが有効になるのは、String s = "aaa"; という宣言の記述法の場合のみである。
たとえば、以下の宣言法の場合、同じ文字列は1つしか生成されない。
String s = "aaa";
String ss = "aaa";

この場合、s と ss は実は同じ "aaa" という1つのオブジェクトを参照している。

一方、以下の宣言法の場合は、同じ文字列でもオブジェクトは異なる。
String s = new String("aaa");
String ss = new String("aaa");

この場合、s と ss は異なるオブジェクトを参照している。
これは一般的なオブジェクトの生成と同じ振る舞いである。

以上の事から、String s = "aaa"; の記述法で統一されている場合、equals による比較と == による比較は、実は同じ結果を返すことがわかる。

ここからが本題であるが、ではどちらの比較方法の方がパフォーマンスがよいのだろうか。それは == のほうである。それは直感的にも明らかであり、もし非常に長い文字列を比較する場合、すべての文字をチェックしなければならないが、オブジェクトの場所の比較は一瞬で終わる。
そのパフォーマンスの違いは、String型の文字列のサイズが大きくなればより顕著になるだろう。(実際、かなり違うらしい)
したがって、もしString型の宣言が、String s = "aaa"; の記述法で統一されている場合は、その比較は == を使った方がよいということになる。
String型オブジェクトの比較は頻出するのでそれがパフォーマンスに及ぼす影響は小さくはないと思われる。

通常は、規約どおりにequalsを使用した方がいいだろう。
しかし、以下の条件を満たしている場合、パフォーマンスの悪化時には試す価値はあるあろう。
1.文字列の比較回数が多い
2.それらの文字列のサイズが大きい
3.String型の宣言方法が String s = "aaa"; の記述法で統一されている

参考にしたのは以下のサイト。
文字列高速比較
http://amsoft.minidns.net/modules/chapox/content.php?lid=11

|

« スレッドはオブジェクトとは独立した存在である | トップページ | コーディング規約とコーディングパターンは違う »

コメント

業務では"aaa"のように単純にはいきません。
DBで検索した文字列だったり、StringBufferで文字列編集したりなどさまざまです。
やはりequalsを使用しないと危険というか、問題ありまくりでしょう。

投稿: ta | 2012年4月30日 (月) 00時09分

java1.5 のソースを見てみましたが、String クラスの equals メソッドでは最初に == で同じオブジェクトかどうかを見てますね。
なので素直に equals メソッドを使えばいいんじゃないでしょうか。

投稿: jugyo | 2009年6月10日 (水) 00時41分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: String型オブジェクトの場合、equalsでの比較より、==の方がパフォーマンスが高い:

« スレッドはオブジェクトとは独立した存在である | トップページ | コーディング規約とコーディングパターンは違う »