Heim  >  Artikel  >  Java  >  Umfassende Erläuterung der Beziehung zwischen StringBuilder-, StringBuffer- und String-Klassen in Java

Umfassende Erläuterung der Beziehung zwischen StringBuilder-, StringBuffer- und String-Klassen in Java

高洛峰
高洛峰Original
2017-01-22 11:39:571527Durchsuche

1. String-Klasse

Der Wert von String ist unveränderlich, was dazu führt, dass jede Operation an String ein neues String-Objekt generiert, was nicht nur ineffizient ist, sondern auch viel begrenzten Speicherplatz verschwendet.
String a = "a"; //Angenommen, a zeigt auf Adresse 0x0001
a = "b";//Nach der Neuzuweisung zeigt a auf Adresse 0x0002, aber das in Adresse 0x0001 gespeicherte „a“ existiert noch. Aber es ist nicht mehr das, worauf a zeigt, a zeigt bereits auf eine andere Adresse.
Daher geht es bei String-Operationen eher um die Änderung der Zuweisungsadresse als um die Änderung des Werts.

2. StringBuffer ist eine veränderbare Klasse und eine Thread-sichere String-Operationsklasse, die kein neues Objekt erstellt. Jedes StringBuffer-Objekt verfügt über eine bestimmte Pufferkapazität. Wenn die Zeichenfolgengröße die Kapazität nicht überschreitet, wird keine neue Kapazität zugewiesen.

StringBuffer buf=new StringBuffer(); //Einen 16-Byte-Zeichenpuffer zuweisen
StringBuffer buf=new StringBuffer(512); //Einen 512-Byte-Zeichenpuffer zuweisen
StringBuffer buf= new StringBuffer("this is a test")//Speichern Sie den String im Puffer und reservieren Sie anschließend einen 16 Byte großen leeren Puffer.

3.StringBuffer
Die Funktionen der StringBuffer- und StringBuilder-Klassen sind grundsätzlich ähnlich. Der Hauptunterschied besteht darin, dass die Methoden der StringBuffer-Klasse multithreaded und sicher sind, während StringBuilder im Vergleich dazu nicht threadsicher ist Die StringBuilder-Klasse wird sich etwas beeilen. Für Strings, deren Werte sich häufig ändern, sollten die Klassen StringBuffer und StringBuilder verwendet werden.

4. Thread-Sicherheit
StringBuffer-Thread-Sicherheit
StringBuilder-Thread unsicher

5. Im Allgemeinen reicht die Geschwindigkeit von schnell bis langsam: StringBuilder>StringBuffer> String, dieser Vergleich ist relativ, nicht absolut.

6. Zusammenfassung
(1) Wenn Sie eine kleine Datenmenge verarbeiten möchten, verwenden Sie = String
(2). data = StringBuilder
(3 ). Multithread-Betrieb des String-Puffers zum Betreiben einer großen Datenmenge = StringBuffer

Das Folgende ist der Code und die Demonstrationsanweisungen:

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(); 
} 
}
Ich habe diesen Code sowohl unter myeclipse als auch unter dos ausgeführt. Die jeweils ausgedruckten Zeiten sind etwas unterschiedlich und die laufenden Ergebnisse sind wie folgt:

1) Wenn myeclipse 10.000 Mal durchlaufen wird:

Umfassende Erläuterung der Beziehung zwischen StringBuilder-, StringBuffer- und String-Klassen in Java

2) Wenn myeclipse 50.000 Mal durchlaufen wird:

Umfassende Erläuterung der Beziehung zwischen StringBuilder-, StringBuffer- und String-Klassen in Java

3) Bei Ausführung unter DOS:

Umfassende Erläuterung der Beziehung zwischen StringBuilder-, StringBuffer- und String-Klassen in Java

Ausführlichere Erklärungen zu StringBuilder, StringBuffer und String in Java. Für Artikel, die sich auf die Beziehung zwischen Klassen beziehen, beachten Sie bitte die chinesische PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn