文字列比較:==とequals()の違い


Javaは==演算子を使用してintやbooleanなどの一般的なデータ型を比較します.ただし、クラス値(たとえばString)は、equals()メソッドを使用して比較されます.
このとき,equalと==の違いを理解しよう.
アドレス値(==)と値(equals)の比較
==演算子は、比較する2つのターゲットのアドレス値を比較し、equalsメソッドは、比較する2つのターゲットの値自体を比較します.
デフォルトタイプ(intタイプやcharタイプなど)が値で呼び出される形式でデフォルトでは、ターゲットにアドレス値はありません.しかしStringは一般的なタイプではありません.クラスはCall by Referenceとして作成され,直ちにアドレス値が与えられる.
したがって、Stringタイプを宣言すると、同じ値を持っていてもアドレス値はまったく異なる値になります.
String変数の作成時にアドレスを割り当てる
String変数を生成するには、2つの方法があります.
1. 리터럴을 이용한 방식
2. new 연산자를 이용한 방식
2つの方法の違いを理解する.
文字を使用するとstring constantpoolという領域があります.
new演算子を使用してStringを作成すると、Heap領域に存在します.
Stringをliteralと宣言すると、内部でStringのintern()メソッドが呼び出されます.
intern()メソッドは、所与の文字列がstring定数pool領域に存在するかどうかを検索し、値が存在する場合はその値のアドレス値を返し、存在しない場合はstring constatnt pool領域に値を追加し、新しいアドレス値を返す.
String s1 = "str";
String s2 = new String("str");

System.out.println(s1 == s2 );		// false
System.out.println(s1.equals(s2));	// true
上記のコードに基づいて、最初の結果値はfalseを出力します.==演算子はアドレス値を比較するので、同じ「str」値を持っていてもs 1とs 2が異なると結論します.
2回再計算した値はtrueを出力します.equalsメソッドはアドレス値ではなくデータ自体の値を比較するため,s 1とs 2の値ともに「str」を有すると結論した.