Home  >  Article  >  Java  >  Comprehensive explanation of the relationship between StringBuilder, StringBuffer, and String classes in Java

Comprehensive explanation of the relationship between StringBuilder, StringBuffer, and String classes in Java

高洛峰
高洛峰Original
2017-01-22 11:39:571524browse

1. String class

The value of String is immutable, which results in each operation on String generating a new String object, which is not only inefficient, but also wastes a lot of limited memory space.
String a = "a"; //Assume a points to address 0x0001
a = "b";//After reassignment, a points to address 0x0002, but the "a" saved in address 0x0001 still exists, but it has been It is no longer what a points to, a already points to another address.
So String operations are all about changing the assignment address rather than changing the value.

2. StringBuffer is a mutable class and a thread-safe string operation class. Any operation on the string it points to will not create a new object. Each StringBuffer object has a certain buffer capacity. When the string size does not exceed the capacity, new capacity will not be allocated. When the string size exceeds the capacity, the capacity will be automatically increased.

StringBuffer buf=new StringBuffer(); //Allocate a 16-byte character buffer
StringBuffer buf=new StringBuffer(512); //Allocate a 512-byte character buffer
StringBuffer buf=new StringBuffer("this is a test")//Store the string in the buffer and reserve a 16-byte empty buffer afterwards.

3.StringBuffer
The functions of the StringBuffer and StringBuilder classes are basically similar. The main difference is that the methods of the StringBuffer class are multi-threaded and safe, while the StringBuilder class is not thread-safe. In comparison, the StringBuilder class will be slightly faster. For strings whose values ​​frequently change, the StringBuffer and StringBuilder classes should be used.

4. Thread safety
StringBuffer thread safety
StringBuilder thread unsafe

5. Speed ​​
Generally, the speed is from fast to slow: StringBuilder>StringBuffer>String ,This comparison is relative, not absolute.

6. Summary
(1). If you want to operate a small amount of data, use = String
(2). Operate a large amount of data in a single-threaded string buffer = StringBuilder
(3 ). Multi-threaded operation of string buffer to operate a large amount of data = StringBuffer

The following is the code and demonstration instructions:

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(); 
} 
}

I ran this code under both myeclipse and dos, and printed them respectively. The output times are somewhat different, and the running results are as follows:
1) When myeclipse is cycled 10,000 times:

Comprehensive explanation of the relationship between StringBuilder, StringBuffer, and String classes in Java

2) When myeclipse is cycled 50,000 times:

Comprehensive explanation of the relationship between StringBuilder, StringBuffer, and String classes in Java

3) When running under DOS:

Comprehensive explanation of the relationship between StringBuilder, StringBuffer, and String classes in Java

More comprehensive explanations of StringBuilder, StringBuffer, and String classes in java For related articles on the relationship between, please pay attention to the PHP Chinese website!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn