string,stringbuffer와stringbuilder의 차이 설명

4501 단어 jvmjdk
간단하게 말하면 String 유형과 StringBuffer 유형의 주요 성능 차이는 String은 변할 수 없는 대상이기 때문에 매번 String 유형을 바꿀 때마다 새로운 String 대상을 생성한 다음에 바늘을 새로운 String 대상에게 가리키는 것과 같다. 따라서 내용을 자주 바꾸는 문자열은 String을 사용하지 않는 것이 좋다. 대상이 생성될 때마다 시스템 성능에 영향을 미치기 때문이다.특히 메모리에 인용 대상이 없으면 JVM의 GC가 작업을 시작하는데 그 속도는 상당히 느릴 것이다.여기에 적절하지 않은 예를 들어 보자.
String Str = “abc”;
For(int i = 0 ; i < 10000 ; i++)
{
   Str + = “def”;
}
만약 그렇다면 이 for 순환이 끝난 후에 메모리에 있는 대상이 GC에 의해 정리되지 않았다면 메모리에 모두 만 개가 넘는 놀라운 숫자가 있었을 것이다. 만약에 이것이 많은 사람들이 사용하는 시스템이라면 이런 숫자는 많지 않을 것이다. 그러므로 모두가 사용할 때 반드시 조심해야 한다.
StringBuffer 클래스를 사용하면 결과가 달라집니다. 매번 결과마다 StringBuffer 대상 자체를 조작하고 새로운 대상을 생성하지 않고 대상 인용을 바꿉니다.그래서 일반적인 상황에서 우리는 StringBuffer를 사용하는 것을 추천한다. 특히 문자열의 대상이 자주 바뀌는 경우.특정한 상황에서 String 대상의 문자열 결합은 사실 JVM에 의해 StringBuffer 대상의 결합으로 해석되기 때문에 이때 String 대상의 속도는 StringBuffer 대상보다 느리지 않다. 특히 아래의 문자열 대상 생성에서 String 효율은 StringBuffer보다 훨씬 빠르다.
String Str = “This is only a” + “simple” + “test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“simple”).append(“test”);
StringStr 대상을 만드는 속도가 너무 빨라서 놀랄 것이다. 이때 StringBuffer는 속도가 전혀 우세하지 않다는 것을 알게 될 것이다.사실 이것은 JVM의 수법이다. JVM의 눈에는 이것이
String Str = “This is only a” + “simple” + “test”; 사실:
String Str = “This is only a simple test”; 그러니까 시간 많이 안 걸리지.그러나 여기서 주의해야 할 것은 문자열이 다른 String 대상에서 왔다면 속도가 그렇게 빠르지 않다는 것이다. 예를 들어 다음과 같다.
String S2 = “This is only a”;
String S3 = “simple”;
String S4 = “test”;
String S1 = S2 +S3 + S4;
이때 JVM은 규칙적으로 원래의 방식대로 할 것이다. S1 대상의 생성 속도는 아까처럼 빠르지 않다. 이따가 우리는 테스트를 해서 검증할 수 있다.
이로부터 우리는 첫 번째 결론을 얻었다.
대부분의 경우 StringBuffer > String
StringBuilder는 그들과 비교하면 어떻습니까?먼저 간단히 소개하자면 StringBuilder는 JDK5입니다.0에 새로 추가된 클래스는 StringBuffer와 다릅니다.
   Java.lang.StringBuffer 스레드의 안전한 가변 문자 시퀀스입니다.스트링과 유사한 문자열 버퍼이지만 수정할 수 없습니다.문자열 버퍼를 여러 라인에 안전하게 사용할 수 있습니다.필요할 때 이 방법들을 동기화할 수 있기 때문에 임의의 특정한 실례상의 모든 조작은 직렬 순서로 발생하는 것과 같고 이 순서는 관련된 모든 라인이 진행하는 방법의 호출 순서와 일치한다.
모든 문자열 버퍼는 일정한 용량을 가지고 있다.문자열 버퍼에 포함된 문자열의 길이가 이 용량을 초과하지 않으면 새 내부 버퍼 그룹을 분배할 필요가 없습니다.내부 버퍼가 넘치면 이 용량은 자동으로 커집니다.JDK 5.0부터 이 클래스에 단일 스레드에 사용되는 등가 클래스, 즉 StringBuilder를 추가합니다.이 클래스에 비해 StringBuilder 클래스는 모든 동일한 작업을 지원하지만 동기화를 수행하지 않기 때문에 속도가 더 빠릅니다.
그러나 StringBuilder의 실례를 여러 라인에 사용하는 것은 안전하지 않습니다.이러한 동기화가 필요하면 StringBuffer를 사용하는 것이 좋습니다.
그러면 다음은 일반적인 추측을 하나 더 해보겠습니다.
대부분의 경우 StringBuilder > StringBuffer
따라서 이 부등식의 전달 정리에 따르면 대부분의 경우
     StringBuilder > StringBuffer > String
string과 stringbuffer의 몇 가지 효율 비교:
시나리오 1:
  (1) String result = "hello"+ "world";
  (2) StringBuffer result = new String().append("hello").append("world");
(1) 효율이 (2)보다 낫다. 이상하게 생각하지 마라. JVM이 다음과 같이 처리하기 때문이다.
컴파일 전 String result = "hello"+ "world"
컴파일 후 String result = "hello world"
시나리오 2:
  (1) public String getString(String s1, String s2) {
  return s1 + s2;
  }
  (2) public String getString(String s1, String s2) {
  return new StringBuffer().append(s1).append(s2);
  }
(1)의 효율은 (2)와 같다. 이는 JVM이 다음과 같이 처리하기 때문이다.
컴파일 전returns1+s2;
컴파일 후 return new StringBuffer ().append(s1).append(s2);
시나리오 3:
  (1) String s = "s1";
  s += "s2";
  s += "s3";
  (2) StringBuffer s = new StringBuffer().append("s1").append("s2").append("s3");
(2)의 효율은 (1)보다 낫다. 스트링은 변할 수 없는 대상이기 때문에 매번'+='조작을 하면 새로운 스트링 대상을 구성할 수 있다.
시나리오 4:
  (1) StringBuffer s = new StringBuffer();
  for (int i = 0; i < 50000; i++) {
  s.append("hello");
  }
  (2) StringBuffer s = new StringBuffer(250000);
  for (int i = 0; i < 50000; i++) {
  s.append("hello");
  }
(2)의 효율은 (1)보다 낫다. StringBuffer 내부에서는char수 그룹이 이루어지기 때문에 기본적으로 초기화 길이는 16이고 문자열 길이가char보다 클 때마다
배열의 길이가 길어지면 JVM은 더 큰 새 배열을 구성하고 원래 배열의 내용을 새 배열로 복사합니다. (2) 배열 복사 비용을 피합니다.
키 포인트
  1). 간단하게 생각하다.append () 효율이 "+"보다 좋은 것은 잘못된 것입니다!
  2). new를 사용하여 String을 만들지 마십시오.
  3). 주의하다.인터넷 () 사용
  4). 컴파일러가 문자열 값을 결정할 수 있는 경우 "+"를 사용하는 것이 가장 효율적입니다.
  5). "+="를 사용하여 문자열을 구성하지 마십시오.
  6). StringBuffer 객체를 선언할 때 기본값을 사용하지 않고 적절한 capacity를 지정합니다(18)
  7). 아래의 양자의 차이가 다르다는 것을 주의해라
  
String s = "a" + "b";

  
String s = "a";

  s += "b";

좋은 웹페이지 즐겨찾기