Java String 비교에 대해서 공부하겠습니다.
느좋 시작~
Java에서 String 비교
1. == 연산자 사용 (참조 비교)
2. equals() 메서드 사용 (내용 비교)
3. compareTo() 메서드 사용 (사전순 비교)
String은 메모리의 Heap 영역과, Method 영역인 String Constant Pool(문자열 상수 풀)에 저장된다.
== 연산자 비교
두 객체의 참조(메모리 주소)를 비교
public class StringCompare {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); // true (리터럴 풀에서 같은 객체)
System.out.println(str1 == str3); // false (새로운 객체)
}
}
- (true) str1 == str2
- str1과 str2는 String Constant Pool(문자열 리터럴 풀)에 저장되므로 같은 객체를 참조함.
- (false) str1 == str3
- str3는 new 키워드를 사용하여 새로운 객체를 생성했기 때문에 다른 메모리 주소를 가
- 즉, == 연산자는 문자열의 내용이 아니라 객체의 참조(주소)를 비교하므로 문자열 내용 비교에는 적합하지 X
equals() 비교
equals() 메서드는 문자열의 실제 내용을 비교
- equals()는 오직 문자열 내용만 비교하므로, 문자열 비교 equals()를 사용하는 것이 적절
객체 안의 문자열 비교하기)
(1) "abc".equals(map.get("key"))
- “abc”는 문자열 리터럴(String Literal)로 컴파일 시점에 상수 풀(String Pool)에 저장됨
- map.get("key")는 반환값이 null일 수 있음
- "abc".equals(null) 인 경우, null을 비교하여 false를 반환하므로 NullPoinerException이 발생하지 XX
(2) map.get("key").equals("abc")
- map.get("key")는 반환값이 null일 경우, null.equals(”abc”) 이므로 NullPointerException이 발생함!
- 이 경우에 따로 예외처리를 추가해야 함
✔ 효율성과 안정성 비교
비교 항목 | (1) | (2) |
Null 처리 | map.get("key") == null이어도 예외 없음 (false 반환) | map.get("key") == null이면 NullPointerException 발생 |
성능 | String 리터럴은 상수 풀을 사용하므로 비교 연산 속도가 빠름 | map.get("key")가 객체일 경우 힙 메모리 비교 수행 가능 |
가독성 | 안정적이고 명확한 코드 | Null 체크가 필요하여 코드가 복잡해질 수 있음 |
'CS' 카테고리의 다른 글
[자료구조] B-Tree란 (1) | 2025.04.10 |
---|---|
[Java] HashMap, LinkedHashMap, TreeMap (0) | 2025.02.17 |
DAO, DTO, VO, Entity (0) | 2025.01.20 |
[Java] 자바 데이터 타입 & 변수 종류 (0) | 2024.07.15 |
[Java] JVM 메모리 구조 & Java의 Call by Value (0) | 2024.07.15 |