一般的なクラスのJavaクラス05_StringBuilder

1.StringBuilderクラスの概要

StringBufferクラスとStringBuilderクラスは非常に似て、クラスAbstractStringBuilder抽象クラスから派生しているUnicode文字の可変配列を表します。StringBuilder StringBufferクラスとクラスのメソッドほぼ正確に同じですが、StringBuilderのは、スレッドセーフではありません、これはStringBufferの間の主な違いです。

  • スレッドセーフのStringBufferは、あまり効率的なスレッド同期チェックを、行います。

  • StringBuilderのスレッドセーフな、高効率(推奨)ので、スレッド同期のチェックを行いません。

JDK1.5バージョンの前にのみStringBufferクラス(スレッドセーフ)であるため、効率を向上させるために同じ文字列のデータは非常に小さい上で動作してマルチスレッドの使用の発見は、JDK1.5後のStringBuilderクラス、StringBuilderクラスを持っていますこれとまったく同じStringBufferの互換性のあるAPIのメソッドとStringBuilderクラスとのStringBufferクラスの機能。

現時点では、我々は、スレッドの同期に関連していない、あなたはどのような結論をStringBuilderの速いStringBufferをより知ることができます。

2.文字列連結の最適化

コンパイラの値を決定できるようにするには、スプライシング操作のための文字列定数を行う場合、コンパイラは値をマージします。

[例]一定の文字列連結を行います

public class Test {
	public static void main(String[] args) {
		test01();
		test02();
	}
	/**
	 * 直接量拼接,对于编译期就能确定的值,编译器会将值合并
	 * String hw = "hello" + "world";反编译class
	 * 我们将看到 : String hw = "helloworld";
     *
	 * 所以hw == helloWorld 输出true
	 */
	public static void test01() {
		String hw = "hello" + "world"; // 等于:String hw = "helloworld";
		String helloWolrd = "helloworld";
		System.out.println(hw == helloWolrd); // 输出:true
	}
	/**
	 * String hw = h + "world";虽然包含变量 h的运算,但是编译器
	 * 对fianl变量在编译期能确定其值,会发生宏替换,即:h变量替换成其值"hello",
	 * 然后编译器会对直接量字串直接合并
	 * String hw = h + "world";在编译完后就变成了 String hw = "helloworld";
     *
	 * 所以hw == helloWorld 输出true
	 */
	public static void test02() {
		final String h = "hello"; // final修饰的是常量
		String hw = h + "world"; // 等于:String hw = "helloworld";
		String helloWolrd = "helloworld";
		System.out.println(hw == helloWolrd); // 输出:true
	}
}

追加の変数のためにやって文字列連結操作は、その後に、彼らはコンパイル時に正確に何を他の特定の値を知ることができないので、最適化処理する方法はありません、参照のアドレス文字列に格納された変数の場合処理するためのStringBuilder内部メカニズムを使用して接続する効果、実現(新規でJDK 5を、私はJDK 1.4は、JDK 1.4で使用される推定値はありませんStringBufferのです)、最終的に出力をToStringメソッド、すべてでそれらを追加します。
[例]列スプライシング操作変数が行います

public class Test {
	/**
	 * hw在编译期并不能确定值,因为h是变量,JVM在运行期才能确定其值
	 * 会在运行期时,进行字串拼接生成新的字串对象,通过javap -c Test查看虚拟机指令
	 * 我们发现String hw = h + "world";其实等效于:
	 * StringBuilder sb = new StringBuilder(h);
	 * sb.append("world");
	 * String hw = sb.toString();
	 *
	 * 所以hw == helloWorld 输出false
	 */
	public static void main(String[] args) {
		String h = "hello";
		String hw = h + "world";
		String helloWolrd = "helloworld";
		System.out.println(hw == helloWolrd); // 输出:false 
	}
}

文字列の効率の比較3。

彼らは、実装の効率性を分析するために実行した時間を算出することで、万スプライシング操作のための文字列、StringBufferの、StringBuilderの文字列を使用しました。

[比較例]ストリングスプライシング効率

public class StringBuilderDemo {
	public static void main(String[] args) {
		stringBuilderMethod(); // 测试StringBuilder耗时
		stringBufferMethod(); // 测试StringBuffer耗时
		stringMethod(); // 测试String耗时 
	}
	// 测试String耗时
	public static void stringMethod() {
		String str = "";
		long now1 = System.currentTimeMillis(); // 开始时间
		for (int i = 0; i < 10000; i++) { // 进行10000次字符串拼接
			str += i; // 相当于产生了10000个StringBuffer对象
		}
		long now2 = System.currentTimeMillis(); // 结束时间
		System.out.println("String耗时:" + (now2 - now1) + "ms");
	}
	// 测试StringBuffer耗时
	public static void stringBufferMethod() {
		StringBuffer sb = new StringBuffer();
		long now1 = System.currentTimeMillis(); // 开始时间
		for (int i = 0; i < 10000; i++) { // 进行10000次字符串拼接
			sb.append(i);
		}
		long now2 = System.currentTimeMillis();	// 结束时间
		System.out.println("StringBuffer耗时:" + (now2 - now1) + "ms");
	}
	// 测试StringBuilder耗时
	public static void stringBuilderMethod() {
		StringBuilder sb = new StringBuilder();
		long now1 = System.currentTimeMillis(); // 开始时间
		for (int i = 0; i < 10000; i++) { // 进行10000次字符串拼接
			sb.append(i);
		}
		long now2 = System.currentTimeMillis(); // 结束时间
		System.out.println("StringBuilder耗时:" + (now2 - now1) + "ms");
	}
}

上記コードの実行結果:
ここに画像を挿入説明
。ほぼ同じ業務効率とのStringBuilder StringBufferの両方がオブジェクト自体で動作しているので、これは、新しい文字列オブジェクトを生成しません。両者の主な違いは、StringBufferのあるスレッドセーフであるが、のStringBuilderはスレッドセーフなので、わずかに高い動作効率のStringBuilderのStringBufferありません。

Stringオブジェクトは、メモリ空間の多くを取る、新しいオブジェクト(のStringBuilder)が生成されます、文字列操作のたびに不変である、これは、システムのパフォーマンス、最小の効率に影響を与えます。

文字列が頻繁に変更する必要がある場合そのため、通常のプログラミング過程で、あなたは文字列を利用するのは避けるべきです。

4.オブジェクトのメソッド呼び出しチェーン

私たちの日常の開発の後、状況のオブジェクトを返すメソッドを呼び出すために会う予定だ、このデザインは、人々の思考によって急速な発展を達成するために、ユーザーは連続チェーンメソッドを呼び出すことができますが、我々はチェーン文法を呼び出します。一般的に使用されるツールで、私たちは途中でこのフォームを返す達成するために、我々のオープンStringBuilderのソースをチェーンを添加する方法を呼び出すためにチェーン構文のモデルを使用しているクラスとメソッドStringBufferのStringBuilderクラスで学んだ:
ここに画像を挿入説明
からソースコードは、私たちはStringBuilderクラスのメソッド挿入するたびに、私たちが呼ばれたことが確認でき、現在の文字列オブジェクト変数を返し、その後、我々は連鎖メソッド呼び出しを達成するためのメソッドを呼び出すことによって返されたオブジェクトを使用し続けることができます。

[例]オブジェクトメソッド呼び出しチェーンケース

// 创建一个可变字符容器,用来存放数据
StringBuilder sb = new StringBuilder("hello-world");
// 通过链式语法操作可变字符串数据
sb.append("-WHSXT").insert(4, "AAA").delete(6, 8);
// 输出:"hellAA-world-WHSXT"
System.out.println(sb);

PS:最新の無料のマニュアルと教育ビデオの場合は、QQグループ(627407545)を追加してください受けます。

公開された92元の記事 ウォンの賞賛0 ビュー2596

おすすめ

転載: blog.csdn.net/zhoujunfeng121/article/details/104784286