티스토리 뷰
1. 불변성(Immutable)
불변성(Immutable): String
가변성(Mutable): StringBuilder, StringBuffer
String은 한번 생성되면 더는 변경이 불가능한 불변하는 객체(Immutable object)로 생성이 된다. 하여 두 String 객체를 연결해줄 경우 새로운 String 객체가 생성되는 것을 예제1) HashCode를 통해 확인할 수 있다. 예제2) 역시 한번 생성된 String 객체는 바뀌지 않지만, StringBuilder와 StringBuffer는 바뀌는 것을 확인할 수 있다. String은 불변하는 객체이므로, 문자열을 붙이거나(Concatenation, '+'), 뽑아내는(substring) 작업을 할 경우 새로운 String 객체를 생성하고 기존 String 객체는 Garbage collection이 일어난다. 이것은 무거운 작업으로 Heap에 많은 Garbage를 남기게 되고 이를 위해 Java는 String 작업을 할 수 있는 StringBuilder와 StringBuffer 클래스를 제공한다.
예제1)
public static void main(String[] args) {
String s = "A";
System.out.println(s.hashCode());
s += "B";
System.out.println(s.hashCode());
}
출력:
65
2081
예제2)
public static void concat1(String s) {
s = s + "B";
}
public static void concat2(StringBuilder sb) {
sb.append("B");
}
public static void concat3(StringBuffer sbf) {
sbf.append("B");
}
public static void main(String[] args) {
String s = "A";
// String s = new String("A"); 역시 같은 결과 출력
concat1(s);
System.out.println("String: " + s);
StringBuilder sb = new StringBuilder("A");
concat2(sb);
System.out.println("StringBuilder: " + sb);
StringBuffer sbf = new StringBuffer("A");
concat3(sbf);
System.out.println("StringBuffer: " + sbf);
}
출력:
String: A
StringBuilder: AB
StringBuffer: AB
2. 비교(Equality)
String의 경우 Object 클래스의 equals() 메소드를 Override해 두 String 객체를 비교할 수 있지만, StringBuilder와 StringBuffer는 equals() 메소드를 Override하지 않아 비교에 사용할 수 없다.
public static void main(String[] args) {
String S = "A";
String s1 = new String(S);
String s2 = new String(S);
System.out.println(s1.equals(s2));
StringBuilder sb1 = new StringBuilder(S);
StringBuilder sb2 = new StringBuilder(S);
System.out.println(sb1.equals(sb2));
StringBuffer sbf1 = new StringBuffer(S);
StringBuffer sbf2 = new StringBuffer(S);
System.out.println(sbf1.equals(sbf2));
}
출력:
true
false
false
3. 성능(Performance), 쓰레드 환경(Thread environment)
우선 기본적으로 String과 StringBuilder는 동기화 되지않는(Non-syncrhonized) 객체로 멀티 쓰레드 환경(Multi-threaded environment)에서 사용하기 적합하고, StringBuffer는 동기화(Synchronized) 객체로 쓰레드 안전(Thread safe)하다. 따라서 멀티 쓰레드 환경에선 여러 쓰레드(Multi thread)가 접근해 처리가 가능한 StringBuilder가 StringBuffer에 비해 더 빠른 처리 속도를 보이고, 사용되는 메모리의 크기는 같다.
(싱글 쓰레드 환경(Single-threaded)에서도 StringBuilder가 StringBuffer보다 더 좋은 성능을 보인다.)
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuilder sb = new StringBuilder();
// StringBuffer sb = new StringBuffer();
for(int i = 0; i<1000000; i++){
sb.append(":").append(i);
}
long endTime = System.currentTimeMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time: "+(endTime-startTime));
System.out.println("Memory:"+(startMemory-endMemory));
}
출력:
// StringBuilder
Time: 55
Memory:22315024
// StringBuffer
Time: 88
Memory:22315024
4. 변환(Conversion)
(1) String에서 StringBuilder 또는 StringBuffer로
String 객체를 StringBuilder 또는 StringBuffer 객체로 변환 시 StringBuilder와 StringBuffer의 생성자를 사용하면 된다.
public static void main(String[] args) {
String s = "A";
StringBuilder sb = new StringBuilder(s);
StringBuffer sbf = new StringBuffer(s);
}
(2) String Builder 또는 StringBuffer에서 String으로
StringBuilder 또는 StringBuffer 객체를 String 객체로 변환 시 toString() 메소드를 사용하면 된다.
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("A");
String s = sb.toString();
StringBuffer sbf = new StringBuffer("B");
s = sbf.toString();
}
(3) StringBuilder를 StringBuffer로 혹은 반대로
StringBuilder 객체를 StringBuffer 객체로 혹은 그 반대로 변환 시 toString() 메소드를 통해 각 객체를 String 객체로 변환 후 다시 변환하고자 하는 객체의 생성자를 사용하면 된다.
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("A");
String s = sb.toString();
StringBuffer sbf = new StringBuffer(s);
}
출처
- https://www.techiedelight.com/difference-between-string-stringbuilder-java/
- https://www.geeksforgeeks.org/string-vs-stringbuilder-vs-stringbuffer-in-java/
- https://www.javatpoint.com/difference-between-stringbuffer-and-stringbuilder
- https://www.journaldev.com/538/string-vs-stringbuffer-vs-stringbuilder
'기술(Tech, IT) > 자바(Java)' 카테고리의 다른 글
[Java] 전역 변수(Global variable) (0) | 2022.09.18 |
---|---|
[Java] 생성자(Constructor) (0) | 2022.09.14 |
[Java] JAR(Java Archive) (0) | 2021.09.18 |
[Java] instanceof (0) | 2021.08.23 |
[Java] ArrayList (0) | 2021.07.05 |
- Total
- Today
- Yesterday
- ml
- 딕셔너리
- Hash Map
- Python
- 머신 러닝
- socket programming
- C++
- machine learning
- 파이썬
- vertex shader
- 오블완
- java
- 소켓 프로그래밍
- min heap
- 이코노미스트 에스프레소
- defaultdict
- 안드로이드
- tf-idf
- The Economist Espresso
- 투 포인터
- The Economist
- 리트코드
- Computer Graphics
- DICTIONARY
- join
- 이코노미스트
- Android
- 티스토리챌린지
- I2C
- leetcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |