본문 바로가기

java

String StringBuider SttringBuffer 차이

Stirng

 - String 객체는 불변(Immutable) 객체이다. String은 메모리에 한번 할당이 되고 할당된 내용을 수정 또는 문자를 추가 하려고 하면 새로운 객체가 생성되고 기존에 할당된 객체는 변경되지 않는다. 

예를 들어 String test = "hello"가 있고  test += "test"; 라고 하면 내부적으로 new StringBuilder(test).append("test").toString()을 호출하게 된다.

그래서 스트링은 불변 객체이다. 


new String과 리터럴 String 의 차이

- 그러면 리터럴로 선언한 스트링과 객체로 선언한 스트링은 어떤 차이가 있을까? 리터럴로 선언한 Stirng은 String Constant Pool에 생성이 되고 new        String으로 할당한 변수는 Heap 메모리에 생성이 된다. 리터럴로 선언한 스트링은 내부적으로 String Constatnt Pool에서 똑같은 문자가 있는지 찾고 있    으면 해당 String Constant Pool에 주소만 가지고 있고 없다면 Stirng Constant Pool에 추가 한다 이 방식으로 인터닝이라 한다.

  java6까지는 String Constatant Pool이  Permgen(Method Area) 영역에 있었는데 Java7 부터 Heap 메모리로 변경이 되었다.

  변경된 이유는 아마도 Garbage Collection의 대상이 되어 좀더 효율적으로 메모리를 관리할수 있어서 변경된것 같다.


StringBuilder와 StringBuffer의 차이

 - StringBuilder와 StringBuffer의 차이는 StringBuffer 메소드에는 Synchronyzed가 걸려 있어 Thread-safe하다. 하지만 StringBuilder를 사용해도 Thread-safe한 이유는 무었일까? 그것은 StringBuilder도 메소드내에서 사용하면 JvmStack에서 관리 되고 JvmStack은 각 스레드마다 생성이 되어 Thread-Safe 하다.


'java' 카테고리의 다른 글

ClassLoader  (0) 2017.10.14
GabageCollector  (0) 2017.10.14
GarbageCollection  (0) 2017.10.13
예외  (0) 2017.10.12
Reduce Max값 구하기  (0) 2017.07.03