String ==, equals() 차이
공통점
둘 다 반환값이 boolean이라는점
<br/>
차이점
- 형태가 다릅니다.
-
==는 연산자
-
equals()는 메소드
<br/>
<br/>
- 비교하는 값이 다릅니다.
<br/>
이 개념을 설명하기전에 String과, new String()의 차이를 이해해야 합니다.
String a1 = "AA";
위의 코드를 선언하면 Heap 영역에 String Pool 공간에 AA라는 문자열을 등록합니다.
<br/>
a1과 같은 문자열의 a2를 선언하였습니다.
String a1 = "AA";
String a2 = "AA";
a2는 Heap 영역의 String Pool 공간에 AA라는 문자열이 있는지 확인하고, 있으면 해당 문자열을 참조하게됩니다.
<br/>
그러나 new String()은 다릅니다.
String a1 = "AA";
String a2 = "AA";
String a3 = new String("AA");
<br/>
new String()으로 선언되면, String Pool을 참조하지않고 새로운 객체를 생성한다.
<br/>
그럼 이제 ==과, equals() 메소드의 차이를 보자.
==는 주소를 비교하고, equals()는 내용을 비교한다.
그렇다면 a1과 a2는 String Pool에 등록된 AA를 참조하니 같은 주소를 참조할 것입니다.
String a1 = "AA";
String a2 = "AA";
String a3 = new String("AA");
System.out.println(a1 == a2);
true
<br/>
같은 주소를 참조하므로 리턴값은 true입니다.
<br/>
그럼 a1과 a3를 == 연산자로 비교하면 다음과 같습니다.
String a1 = "AA";
String a2 = "AA";
String a3 = new String("AA");
System.out.println(a1 == a2);
System.out.println(a1 == a3);
true
false
a1과 a3는 주소가 다르므로 리턴값은 false 입니다.
== 연산자는 주소를 비교하는 것을 확인 할 수 있습니다.
<br/>
반면에, equals() 메소드는 내용을 비교하여 리턴합니다.
a1과 a3를 equals()메소드로 비교해봅니다.
String a1 = "AA";
String a2 = "AA";
String a3 = new String("AA");
System.out.println(a1 == a2);
System.out.println(a1 == a3);
System.out.println(a1.equals(a3));
true
false
true
결과는 내용이 같으므로 true입니다.
equals() 메소드는 내용을 비교하는 것을 확인 할 수 있습니다.
<br/>
그럼 다음과 같은 상황도 있습니다.
new String() 으로 새로 생성된 객체를 String.intern() 메소드를 호출하면
String Pool에 등록된 주소를 참조합니다. 그 내용을 확인하기 위해 다음과 같이 코드를 작성하였습니다.
String a1 = "AA";
String a2 = "AA";
String a3 = new String("AA");
System.out.println(a1 == a2);
System.out.println(a1 == a3);
System.out.println(a1.equals(a3));
System.out.println(a1 == a3.intern());
true
false
true
true
결과는 String Pool에 AA 문자열을 참조하게되어, 동일한 주소값을 가지므로 true를 반환합니다.
<br/>
<br/>
참조
<a href="http://hoit89.tistory.com/entry/String-Stringintern-String-poolequals">http://hoit89.tistory.com/entry/String-Stringintern-String-poolequals</a>
<a href="https://ojava.tistory.com/15">https://ojava.tistory.com/15</a>