比較[AVA]文字列


JAVAではintやbooleanなどの共通データ型を==という演算子で比較する.
しかし、文字列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()メソッドを用いて比較する.🙆‍