2014-03-06 2 views
0

나는이 질문이 많은 사이트에서 여러 해 전에 여러 번 대답되었다는 것을 알고있다. : P 그래도 나는 이것을 게시 할 생각을 가지고있다. 기본 차이점은 String은 변경 불가능하며 String에서 작업 할 때마다 새 String 객체가 만들어집니다.자바에서 문자열과 StringBuffer의 차이점

예 : - 위의 경우

String str = "some"; str = str + " text"

는 2 개의 새로운 문자열 대신 StringBuffer를 사용하여 방지 할 수 있습니다 기존의 STR을 수정하는 생성 얻을.

예 : - 여기 StringBuffer str = new StringBuffer(); str.append("try"); str.append("this");

내 질문에, 우리는 다시 문자열을 전달하는 방법을 추가 할 수 있습니다. 위의 경우 문자열 풀에서 "try"및 "this"에 대해 새 String 객체가 만들어지지 않습니다.

답변

1

예, 새로운 문자열 개체는 "try""this"에 대해 생성됩니다. 이점은 StringBuffer가 문자열을 동적으로 크기 조정 된 배열로 내부적으로 저장한다는 점입니다. 당신이 중간 값을 필요로하기 때문에

"try" + "this" + "test" 

이 잠재적으로 5 문자열 개체를 만들 것입니다 : 우리는 두 개 이상의 문자열을 연결한다면

그것은 더 분명 도움이 있습니다. (리터럴의 기술적 연결은 컴파일 시점에 수행되므로 개념적인 예일뿐입니다.) 리터럴이 아니면 StringBuilder을 사용하여 컴파일러에서 위의 스 니펫을 리팩터링하는 것이 일반적입니다.

StringBuilderStringBuffer의 최신 및 비 동기화 버전입니다. 일반적으로 StringBuilder을 선호합니다. 이 두 클래스의 차이점은 "StringBuilder and StringBuffer in Java"입니다.

+0

대답은 게시에서 http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator "+"연산자에 의해 뒷받침되는 것 같습니다 StringBuilder. 따라서 원래 질문은 이전 버전에 유효 할 것입니다. – user3386493

0

"StringBuffer"가 변경 가능하고 "String"이 변경 불가능한 것 외에도 주요 차이점은 성능입니다. 나는 또한 StringBuffer를 동기화하고 모두 StringBuilder가 없기 때문에 StringBuilder이 StringBuffer를 선호 것을 발견 그러나 내가 좋은 설명 here

을 발견했다.

0

일부 문자열에 대해서는 실제로 차이가 없습니다.

그래서 당신이 (당신의 필요에 따라, 또는 모두 StringBuilder)의 StringBuffer를 사용해야하는 이유 예를 들어이 +

이 시도하고 참조를 사용하는 대신 문자열 연결 당신을 표시 할 수 있습니다 생각에 대한 자신

public class UseSB { 
    static int x = 100000; 
    public static void main(String[] args) { 
     long i1 = System.currentTimeMillis(); 
     main1(); 
     long i2 = System.currentTimeMillis(); 
     main2(); 
     long i3 = System.currentTimeMillis(); 
     System.out.println(i2-i1); 
     System.out.println(i3-i2); 
    } 

    public static void main1() { 
     String s = "x"; 
     for(int i=0;i<x;i++){ 
      s = s + Integer.toString(i); 
     } 
     System.out.println(s.length()); 
    } 

    public static void main2() { 
     StringBuffer s = new StringBuffer("x"); 
     for(int i=0;i<x;i++){ 
      s.append(Integer.toString(i)); 
     } 
     System.out.println(s.toString().length()); 
    } 

} 
0
  • 문자열 : 문자열은 immutable (한 번 생성 된 것은 변경할 수 없음) 개체입니다. 문자열로 생성 된 객체는 상수 문자열 풀에 저장됩니다. Java의 모든 불변 개체는 스레드로부터 안전하므로 String은 스레드로부터 안전합니다. String은 두 개의 스레드가 동시에 사용할 수 없습니다. 일단 할당 된 문자열은 변경할 수 없습니다.

  • 의 StringBuffer : StringBuffer를이 mutable입니다. 즉, 객체의 값을 변경할 수 있습니다. StringBuffer를 통해 생성 된 객체는 힙에 저장됩니다. StringBuffer는 StringBuilder와 같은 메소드를 가지고 있지만 StringBuffer의 각 메소드는 동기화되어있어 StringBuffer는 스레드로부터 안전합니다.

    이로 인해 두 스레드가 동일한 방법을 동시에 액세스 할 수 없습니다. 각 메서드는 한 번에 하나의 스레드에서 액세스 할 수 있습니다.

    스레드 안전성으로 인해 StringBuffer 히트의 성능이 저하되기 때문에 스레드 안전성은 단점을 가지고 있습니다. 따라서 StringBuilder는 각 클래스의 동일한 메서드를 호출 할 때 StringBuffer보다 빠릅니다.

  • 의 StringBuilder : 의 StringBuilder는 그것이 힙 오브젝트를 저장하고, 또한 변형 될 수 있으며, StringBuffer와 동일하다. StringBuilder와 StringBuilder의 주요 차이점은 StringBuilder도 스레드로부터 안전하지 않다는 것입니다. StringBuilder는 스레드로부터 안전하지 않으므로 빠릅니다.

출처 :http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

관련 문제