string,stringbuffer와stringbuilder의 차이 설명
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";
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.