文字列比較:==とequals()の違い
Javaは==演算子を使用してintやbooleanなどの一般的なデータ型を比較します.ただし、クラス値(たとえばString)は、equals()メソッドを使用して比較されます.
このとき,equalと==の違いを理解しよう.
アドレス値(==)と値(equals)の比較
==演算子は、比較する2つのターゲットのアドレス値を比較し、equalsメソッドは、比較する2つのターゲットの値自体を比較します.
デフォルトタイプ(intタイプやcharタイプなど)が値で呼び出される形式でデフォルトでは、ターゲットにアドレス値はありません.しかしStringは一般的なタイプではありません.クラスはCall by Referenceとして作成され,直ちにアドレス値が与えられる.
したがって、Stringタイプを宣言すると、同じ値を持っていてもアドレス値はまったく異なる値になります.
String変数の作成時にアドレスを割り当てる
String変数を生成するには、2つの方法があります.
文字を使用するとstring constantpoolという領域があります.
new演算子を使用してStringを作成すると、Heap領域に存在します.
Stringをliteralと宣言すると、内部でStringのintern()メソッドが呼び出されます.
intern()メソッドは、所与の文字列がstring定数pool領域に存在するかどうかを検索し、値が存在する場合はその値のアドレス値を返し、存在しない場合はstring constatnt pool領域に値を追加し、新しいアドレス値を返す.
2回再計算した値はtrueを出力します.equalsメソッドはアドレス値ではなくデータ自体の値を比較するため,s 1とs 2の値ともに「str」を有すると結論した.
このとき,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」を有すると結論した.
Reference
この問題について(文字列比較:==とequals()の違い), 我々は、より多くの情報をここで見つけました https://velog.io/@doeunllee/Java-문자열-비교-과-equals-의-차이점テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol