ホームページ  >  記事  >  Java  >  文字列バッファと文字列ビルダーの違い

文字列バッファと文字列ビルダーの違い

(*-*)浩
(*-*)浩オリジナル
2019-06-04 13:19:263536ブラウズ

Java で作業している場合でも Android で作業している場合でも、この問題に遭遇することは避けられません。実際、通常、開発プロセス中にこの問題に苦労することはありません。この質問は面接で必須の古典的な質問です。今日はそれをまとめます。

文字列バッファと文字列ビルダーの違い

#StringBuffer と StringBuilder の違い

StringBuffer と StringBuilder のメソッドと関数は、次のメソッドを除いて完全に同等です。 StringBuffer それらのほとんどは synchronized キーワードで変更されているため、スレッドセーフであり、同時操作をサポートし、マルチスレッドでの使用に適しています。 StringBuilder は同時操作をサポートしておらず、直線的に安全ではなく、マルチスレッドでの使用には適していません。新しく導入された StringBuilder クラスはスレッドセーフではありませんが、単一スレッドでのパフォーマンスは StringBuffer よりも優れています。 (推奨学習:

JAVA ビデオ チュートリアル )

次に、一目でわかるテスト プロセスと結果のコードを直接貼り付けます:

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

実行結果を見てください:

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
上記の結果からわかるように、マルチスレッドに関係なく、String オブジェクトを使用する場合 (Count/100 としました)、実行時間は他の 2 つよりも長く、StringBuffer オブジェクトを使用する場合と StringBuilder オブジェクトを使用する場合の違いも明らかです。プログラムがシングル スレッドで実行されている場合、またはスレッド同期の問題を考慮する必要がない場合は、StringBuilder クラスの使用を優先する必要があることがわかりますが、スレッドの安全性を確保したい場合は、当然 StringBuffer を使用します。

次のリストのテスト結果から、マルチスレッドのサポートの違いを除けば、これら 2 つのクラスの使用法と結果にはほとんど違いがないことがわかります。

JAVA 関連の技術記事の詳細については、

JAVA 開発チュートリアル 列にアクセスして学習してください。

以上が文字列バッファと文字列ビルダーの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。