String의 작동 방식 문제
String은 특수한 객체형 타입이다.
원시 타입처럼 변수에 문자열을 수정하거나 재할당할 수 있지만, 객체 자체를 수정하는 대신 새 객체를 만들어 할당한다.
이는 성능적으로 좋지 못하다.
예시
import com.cake.Lam1;
public class Main {
public static void main(String[] args) {
String a = "hello";
System.out.println(a);
System.out.println(System.identityHashCode(a));
a += " world";
System.out.println(a);
System.out.println(System.identityHashCode(a));
}
}
//출력
//hello
//1311053135
//hello world
//118352462
// 동일한 변수이지만 재할당 과정에서 새 객체를 할당하며 메모리 주소가 변경되었다.
참고
System.identityHashCode(a)
대상의 실제 메모리 주소를 기반으로 10진수코드로 해싱하여 반환한다.
두 객체를 비교할 때 내부 데이터가 동일하더라도 메모리 주소가 다르면 다르게 반환된다.(동일성)
String a.hashCode()
대상의 내부 데이터에 기반하여 해싱된 코드를 반환한다.
두 객체를 비교할 때 내부 데이터가 동일하면 메모리 주소가 달라도 동일하게 반환된다.(동치성)
StringBuffer
String의 재할당 문제에서 대안으로 제시되었다.
데이터를 수정할 때 객체가 재생성되지 않는다.
StringBuffer a = new StringBuffer("qweqe");
System.out.println(a);
System.out.println(System.identityHashCode(a));
a=a.append("11");
System.out.println(a);
System.out.println(System.identityHashCode(a));
// append로 간단한 수정 가능
// 메모리 재활용으로 수정 후 주소도 동일
StringBuilder
StringBuffer와 유사하게 데이터를 재수정할 때 객체 재할당 문제를 해결한다.
안정성은 버퍼가 좋고, 빌더는 속도가 더 빠르다.
버퍼는 동기적 방식으로 작업을 처리. 데이터 드랍 방지.
빌더는 대량의 데이터를 빠르게 처리할 때 유리하며 일반적으로 많이 사용한다.
대표적 메소드
a1.append(a)
// a 문자열 삽입
a1.insert(a,b);
// a 인덱스에 b 문자열 삽입
a1.delete(a, b);
// a 인덱스부터 b-1 까지 삭제
'java' 카테고리의 다른 글
[java/기본] 입력과 출력 (0) | 2024.04.21 |
---|---|
[java/기본] 예외 처리 (0) | 2024.04.21 |
[java] Scanner로 유저의 입력 받기 (0) | 2024.04.21 |
[java] 람다식 기초 사용법 (0) | 2024.04.21 |
[java/기본] package와 import (0) | 2024.04.20 |