Egal, ob Sie mit Java oder Android arbeiten, Sie werden mit diesem Problem normalerweise nicht zu kämpfen haben. Diese Frage ist in Vorstellungsgesprächen ein Muss Heute werde ich es zusammenfassen.
Unterschiede zwischen StringBuffer und StringBuilder
Die Methoden und Funktionen in StringBuffer und StringBuilder sind völlig gleichwertig, mit Ausnahme der Methoden in StringBuffer Die meisten von ihnen werden mit dem Schlüsselwort synchronisiert geändert, sodass sie Thread-sicher sind, gleichzeitige Vorgänge unterstützen und für die Verwendung in Multithreads geeignet sind. StringBuilder unterstützt keine gleichzeitigen Vorgänge, ist linear unsicher und nicht für die Verwendung in Multithreads geeignet. Die neu eingeführte StringBuilder-Klasse ist nicht threadsicher, aber ihre Leistung in einem einzelnen Thread ist höher als die von StringBuffer. (Empfohlenes Lernen: JAVA-Video-Tutorial)
Als nächstes füge ich direkt den Code des Testprozesses und der Ergebnisse ein, was auf einen Blick klar ist:
public class StringTest { public static String BASEINFO = "Mr.Y"; public static final int COUNT = 2000000; /** * 执行一项String赋值测试 */ public static void doStringTest() { String str = new String(BASEINFO); long starttime = System.currentTimeMillis(); for (int i = 0; i < COUNT / 100; i++) { str = str + "miss"; } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used String."); } /** * 执行一项StringBuffer赋值测试 */ public static void doStringBufferTest() { StringBuffer sb = new StringBuffer(BASEINFO); long starttime = System.currentTimeMillis(); for (int i = 0; i < COUNT; i++) { sb = sb.append("miss"); } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used StringBuffer."); } /** * 执行一项StringBuilder赋值测试 */ public static void doStringBuilderTest() { StringBuilder sb = new StringBuilder(BASEINFO); long starttime = System.currentTimeMillis(); for (int i = 0; i < COUNT; i++) { sb = sb.append("miss"); } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used StringBuilder."); } /** * 测试StringBuffer遍历赋值结果 * * @param mlist */ public static void doStringBufferListTest(List<String> mlist) { StringBuffer sb = new StringBuffer(); long starttime = System.currentTimeMillis(); for (String string : mlist) { sb.append(string); } long endtime = System.currentTimeMillis(); System.out.println(sb.toString() + "buffer cost:" + (endtime - starttime) + " millis"); } /** * 测试StringBuilder迭代赋值结果 * * @param mlist */ public static void doStringBuilderListTest(List<String> mlist) { StringBuilder sb = new StringBuilder(); long starttime = System.currentTimeMillis(); for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) { sb.append(iterator.next()); } long endtime = System.currentTimeMillis(); System.out.println(sb.toString() + "builder cost:" + (endtime - starttime) + " millis"); } public static void main(String[] args) { doStringTest(); doStringBufferTest(); doStringBuilderTest(); List<String> list = new ArrayList<String>(); list.add(" I "); list.add(" like "); list.add(" BeiJing "); list.add(" tian "); list.add(" an "); list.add(" men "); list.add(" . "); doStringBufferListTest(list); doStringBuilderListTest(list); } }
Sehen Sie sich die Ausführungsergebnisse an:
2711 millis has costed when used String. 211 millis has costed when used StringBuffer. 141 millis has costed when used StringBuilder. I like BeiJing tian an men . buffer cost:1 millis I like BeiJing tian an men . builder cost:0 millis
Wie aus den obigen Ergebnissen ersichtlich ist, unabhängig vom Multithreading, wenn String-Objekte verwendet werden (ich habe Count/100 eingegeben), Die Ausführungszeit ist länger als bei den anderen beiden, und der Unterschied zwischen der Verwendung von StringBuffer-Objekten und der Verwendung von StringBuilder-Objekten ist ebenfalls offensichtlich. Es ist ersichtlich, dass wir, wenn unser Programm in einem einzelnen Thread ausgeführt wird oder keine Thread-Synchronisierungsprobleme berücksichtigt werden müssen, der Verwendung der StringBuilder-Klasse Vorrang einräumen sollten, wenn wir die Thread-Sicherheit gewährleisten möchten. Dies ist natürlich StringBuffer.
Wie aus den Testergebnissen der folgenden Liste ersichtlich ist, gibt es bis auf die unterschiedliche Unterstützung für Multithreading nahezu keinen Unterschied in der Verwendung und den Ergebnissen dieser beiden Klassen.
Weitere technische Artikel zum Thema JAVA finden Sie in der Spalte JAVA-Entwicklungs-Tutorial, um mehr darüber zu erfahren!
Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen Stringbuffer und Stringbuilder. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!