StringBuilder와 StringBuffer를 공부하다가 StringBuilder에서의 equals 출력 값과 String에서의 equals 출력 값이 다르다는 것을 발견했다. 그래서 왜 다른지 열심히 구글링 하고 오카방에 여쭤보았다.
원래 equals() 는 주소를 비교한다.
- 아래 코드는 자바에서 equals() 메소드 구현한 코드이다. 보면 ==을 이용하여 비교를 한다. 즉, 오버라이딩 되지 않은 equals는 ==를 사용하여 주소 값을 비교한다.
public boolean equals(Object obj) {
return (this == obj);
}
그러면 왜 아래 코드는 이러한 값을 출력할까?
StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb1.equals(sb2)); //false 여기서는 주소 비교
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); //true 여기서는 값을 비교
결과를 먼저 말하자면 String은 equals 메소드를 오버라이딩 하였고, StringBuilder는 equals 메소드를 오버라이딩 하지 않았다.
그래서 sb1과 sb2를 equals 사용하여 비교하면 오버라이딩 하지 않았기 때문에 주소를 비교하여 false가 출력된다.
str1과 str2를 equals 사용하여 비교하면 String 클래스에서 오버라이딩 했기 때문에 값을 비교하여 true가 출력된다.
equals 오버라이딩
main 부분
StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
A a = new A(sb1);
A b = new A(sb2);
System.out.print(a.equals(b)); //true 출력
class A
class A {
StringBuilder sb;
A(StringBuilder sb){
this.sb = sb;
}
public boolean equals(Object o){
A a = (A) o;
if(a.sb.length() != sb.length())
return false;
int n = sb.length();
for(int i = 0; i < n; i++){
if(sb.charAt(i) != a.sb.charAt(i))
return false;
}
return true;
}
}
'Java' 카테고리의 다른 글
final 키워드 (0) | 2022.03.05 |
---|---|
스트림 (0) | 2022.01.04 |
String Operator '+' 의 작동 원리(2022.03.24 수정) Java 9 (0) | 2021.05.25 |
Object 메소드 (0) | 2021.05.24 |
(TYPE) type -> String , String -> type(TYPE) (0) | 2021.05.24 |