>  기사  >  Java  >  Java의 StringBuilder, StringBuffer 및 String 클래스 간의 관계에 대한 포괄적인 설명

Java의 StringBuilder, StringBuffer 및 String 클래스 간의 관계에 대한 포괄적인 설명

高洛峰
高洛峰원래의
2017-01-22 11:39:571514검색

1. 문자열 클래스

String의 값은 변경할 수 없으므로 String에 대한 각 작업이 새 String 개체를 생성하게 되어 비효율적일 뿐만 아니라 제한된 메모리 공간을 많이 낭비합니다.
String a = "a"; //a가 주소 0x0001을 가리킨다고 가정
a = "b";//재할당 후 a는 주소 0x0002를 가리키지만, 주소 0x0001에 저장된 "a"는 여전히 존재합니다. 하지만 그것은 더 이상 a가 가리키는 것이 아니며, a는 이미 다른 주소를 가리키고 있습니다.
따라서 문자열 연산은 값을 변경하는 것이 아니라 할당 주소를 변경하는 것입니다.

2. StringBuffer는 변경 가능한 클래스이며 스레드로부터 안전한 문자열 작업 클래스입니다. 이 클래스가 가리키는 문자열에 대한 작업은 새 객체를 생성하지 않습니다. 각 StringBuffer 객체에는 특정 버퍼 용량이 있습니다. 문자열 크기가 용량을 초과하지 않으면 새 용량이 할당되지 않습니다. 문자열 크기가 용량을 초과하면 용량이 자동으로 늘어납니다.

StringBuffer buf=new StringBuffer(); //16바이트 문자 버퍼 할당
StringBuffer buf=new StringBuffer(512) //512바이트 문자 버퍼 할당
StringBuffer buf= new StringBuffer("this is a test")//문자열을 버퍼에 저장하고 나중에 16바이트의 빈 버퍼를 예약합니다.
4. 스레드 안전성
StringBuffer 스레드 안전성
StringBuilder 스레드 안전하지 않음

5. 속도 ​​
일반적으로 속도는 빠른 것부터 느린 것까지입니다: StringBuilder>StringBuffer> String , 이 비교는 절대적이지 않고 상대적입니다.

6. 요약
(1) 소량의 데이터를 연산하려면 = String
(2)을 사용하세요. = StringBuilder
(3) 대용량 데이터를 연산하기 위한 문자열 버퍼의 멀티스레드 연산 = StringBuffer

코드와 데모 명령어는 다음과 같습니다.

public class TestCharacter { 
final static int time = 50000; //循环次数 

public TestCharacter(){ 

} 
public void test(String s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s += “add”; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test(StringBuffer s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s.append(“add”); 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getCanonicalName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test(StringBuilder s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s.append(“add”); 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 

/*对 String 直接进行字符串拼接的测试*/ 
public void test2(){ 
String s2 = “abcd”; 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
String s = s2 + s2 +s2; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作字符串对象引用相加类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test3(){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
String s =”abcd” + “abcd” + “abcd”; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作字符串相加使用的时间为:”+(over-begin)+”毫秒”); 
} 
public static void main(String[] args){ 
String s1 = “abcd”; 
StringBuffer st1 = new StringBuffer(“abcd”); 
StringBuilder st2 = new StringBuilder(“abcd”); 
TestCharacter tc = new TestCharacter(); 
tc.test(s1); 
tc.test(st1); 
tc.test(st2); 
tc.test2(); 
tc.test3(); 
} 
}

이것을 실행했습니다. myeclipse와 dos 모두에 코드를 작성하여 각각 출력했는데, 실행 결과는 다음과 같습니다.
1) myeclipse를 10,000번 순환한 경우:



2) myeclipse가 50,000번 순환되는 경우: Java의 StringBuilder, StringBuffer 및 String 클래스 간의 관계에 대한 포괄적인 설명

3) DOS에서 실행되는 경우: Java의 StringBuilder, StringBuffer 및 String 클래스 간의 관계에 대한 포괄적인 설명

Java의 StringBuilder, StringBuffer 및 String 클래스에 대한 보다 포괄적인 설명 이들 간의 관계에 대한 기사는 PHP 중국어 웹사이트를 주목하세요! Java의 StringBuilder, StringBuffer 및 String 클래스 간의 관계에 대한 포괄적인 설명

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.