比較[AVA]文字列
JAVAではintやbooleanなどの共通データ型を==という演算子で比較する.
しかし、文字列Stringを比較する場合、==ではなくequals()という方法を使うべきですが、これは何が違うのでしょうか.
String変数を生成するには、次の2つの方法があります.
==演算子は2つのターゲット参照のアドレス値を比較するので、int、booleanなどの基本タイプ(primitive type)はデフォルトではターゲットのアドレス値を持たないので、値自体を比較することができますが、参照タイプ(reference type)であるStringではアドレス値を比較します.
以上のように、文字で生成されたstr 1とstr 2は、両方のオブジェクトが同じアドレスを指しているのでtrueを返すが、生成者で生成されたstr 3オブジェクトはheapメモリから独立して生成されたオブジェクトであるため、str 1、str 2が指すアドレスとは異なるためfalseを返す.
上記のようにstr 1とstr 2、および両方のオブジェクトはジェネレータを使用して生成されますが、異なるアドレスを指しているためfalseが返されます.
equals()メソッドは、オブジェクトが持つ値自体を比較し、最上位のObjectクラスに組み込まれるため、すべてのサブクラスを上書き(再定義)することができます.
str 1とstr 2は互いに指すアドレスが異なるが、値自体が「hello」であるためtrueを返し、同様にstr 2とstr 3も異なるアドレスを指すが、値は同じであるためtrueを返す.
このように文字列のアドレスは生成方法によって異なるので,比較データ値自体のequals()メソッドを用いて比較する.🙆
しかし、文字列Stringを比較する場合、==ではなくequals()という方法を使うべきですが、これは何が違うのでしょうか.
1.String変数の作成方法
String変数を生成するには、次の2つの方法があります.
1)文字列文字の使用
String str1 = "eden";
2)新しい演算子の使用
String str2 = new String(eden);
この2つの方法には大きな違いがあり、1番のように文字を使用すると、文字はString Constant Pool、文字列定数プールに格納され、すでに存在する文字列を新しい変数として宣言すると、同じアドレスを指します.String str1 = "eden"; // 100번지 주소에 저장
String str2 = "Hello"; // 200번지 주소에 저장
String str3 = "eden"; // 동일한 문자열이 저장된 100번지 주소를 가르킴
ただし、生成されたStringオブジェクト(2番目など)は、new演算子を使用して生成された他のオブジェクトと同様に、Heapメモリに独立して格納されます.String str1 = "eden"; // 100번지 주소에 저장
String str2 = "Hello"; // 200번지 주소에 저장
String str3 = "eden"; // 300번지 주소에 새로이 저장
2.==演算子
==演算子は2つのターゲット参照のアドレス値を比較するので、int、booleanなどの基本タイプ(primitive type)はデフォルトではターゲットのアドレス値を持たないので、値自体を比較することができますが、参照タイプ(reference type)であるStringではアドレス値を比較します.
public class exam {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println("str1 == str2 : " + (str1 == str2));
String str3 = new String("Hello");
System.out.println("str1 == str3 : " + (str1 == str3));
}
}
以上のように、文字で生成されたstr 1とstr 2は、両方のオブジェクトが同じアドレスを指しているのでtrueを返すが、生成者で生成されたstr 3オブジェクトはheapメモリから独立して生成されたオブジェクトであるため、str 1、str 2が指すアドレスとは異なるためfalseを返す.
public class exam {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println("str1 == str2 : " + (str1 == str2));
}
}
上記のようにstr 1とstr 2、および両方のオブジェクトはジェネレータを使用して生成されますが、異なるアドレスを指しているためfalseが返されます.
3.equals()メソッド
equals()メソッドは、オブジェクトが持つ値自体を比較し、最上位のObjectクラスに組み込まれるため、すべてのサブクラスを上書き(再定義)することができます.
public class exam {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String("Hello");
String str3 = new String("Hello");
System.out.println("str1.equals(str2) : " + (str1.equals(str2)));
System.out.println("str2.equals(str3) : " + (str2.equals(str3)));
}
}
str 1とstr 2は互いに指すアドレスが異なるが、値自体が「hello」であるためtrueを返し、同様にstr 2とstr 3も異なるアドレスを指すが、値は同じであるためtrueを返す.
このように文字列のアドレスは生成方法によって異なるので,比較データ値自体のequals()メソッドを用いて比較する.🙆
Reference
この問題について(比較[AVA]文字列), 我々は、より多くの情報をここで見つけました https://velog.io/@leeeden/JAVA-문자열-비교하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol