Maison  >  Article  >  Java  >  La différence entre stringbuffer et stringbuilder

La différence entre stringbuffer et stringbuilder

(*-*)浩
(*-*)浩original
2019-06-04 13:19:263530parcourir

Que vous travailliez sur Java ou Android, vous ne pouvez pas éviter de rencontrer ce problème. En fait, vous n'avez généralement pas de difficulté avec cela pendant le processus de développement. Cette question est une question classique incontournable dans les entretiens. temps aujourd'hui, je vais le résumer.

La différence entre stringbuffer et stringbuilder

Différences entre StringBuffer et StringBuilder

Les méthodes et fonctions de StringBuffer et StringBuilder sont complètement équivalentes, à l'exception des méthodes de StringBuffer La plupart d'entre eux sont modifiés avec le mot-clé synchronisé, ils sont donc thread-safe, prennent en charge les opérations simultanées et conviennent à une utilisation multi-thread. StringBuilder ne prend pas en charge les opérations simultanées, est linéairement dangereux et ne convient pas à une utilisation multithread. La classe StringBuilder nouvellement introduite n'est pas thread-safe, mais ses performances dans un seul thread sont supérieures à celles de StringBuffer. (Apprentissage recommandé : Tutoriel vidéo JAVA)

Ensuite, je colle directement le code du processus de test et des résultats, qui est clair en un coup d'œil :

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

Regardez les résultats d'exécution :

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

Comme le montrent les résultats ci-dessus, quel que soit le multi-threading, lors de l'utilisation d'objets String (je mets Count/100), le temps d'exécution est plus long que les deux autres High, et la différence entre l'utilisation d'objets StringBuffer et l'utilisation d'objets StringBuilder est également évidente. On peut voir que si notre programme s'exécute dans un seul thread, ou s'il n'est pas nécessaire de prendre en compte les problèmes de synchronisation des threads, nous devons donner la priorité à l'utilisation de la classe StringBuilder si nous voulons garantir la sécurité des threads, c'est naturellement StringBuffer ;

Comme le montrent les résultats des tests de la liste suivante, à l'exception de la prise en charge différente du multi-threading, il n'y a presque aucune différence dans l'utilisation et les résultats de ces deux classes.

Pour plus d'articles techniques liés à JAVA, veuillez visiter la colonne Tutoriel de développement JAVA pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn