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: