1文字列
文字列:文字列定数、文字列の長さは不可能です。
2 stringbuffer
StringBuffer:String変数(同期、つまりスレッドセーフ)。文字列コンテンツを頻繁に変更する場合は、効率的な理由でStringBufferを使用することをお勧めします。文字列タイプに変換する場合は、stringbufferのtoString()メソッドを呼び出すことができます。
java.lang.stringbufferスレッドセーフ可変文字シーケンス。いつでも特定の一連の文字が含まれていますが、シーケンスの長さと内容は、一部のメソッド呼び出しによって変更できます。文字列バッファーは、複数のスレッドに安全に使用できます。
StringBufferの主な操作は、あらゆるタイプのデータを受け入れるために過負荷にすることができる追加および挿入メソッドです。各メソッドは、指定されたデータを文字列に効果的に変換し、文字列の文字を文字列バッファーに追加または挿入できます。追加方法は、常にこれらの文字をバッファの最後に追加します。挿入方法は、指定されたポイントに文字を追加します。たとえば、zが現在のコンテンツが「start」である文字列バッファオブジェクトを指す場合、このメソッドはz.append( "le")を呼び出し、文字列バッファーに「startle」を含み、z.insert(4、 "le")が文字列バッファを変更して「スターレット」を含みます。
3 StringBuilder
StringBuilder:String変数(非スレッドセーフ)。
Java.lang.StringBuilderは、JDK5.0に新たに追加された可変文字シーケンスです。このクラスは、StringBuffer互換のAPIを提供しますが、同期することは保証されていません。このクラスは、文字列バッファーが単一のスレッドで使用される場合(これは一般)、StringBufferの単純な代替品になるように設計されています。可能であれば、ほとんどの実装ではStringBufferよりも速いため、このクラスを最初に受講することをお勧めします。両方の方法は基本的に同じです。
ほとんどの場合、stringbuilder> stringbuffer。
4 3つの違い
文字列タイプとstringbufferの主なパフォーマンスの違い:文字列は不変のオブジェクトです。したがって、文字列タイプが変更されるたびに、新しい文字列オブジェクトが生成され、ポインターが新しい文字列オブジェクトを指します。したがって、オブジェクトが生成されるたびにシステムのパフォーマンスに影響を与えるたびに、特にメモリ内に参照されるオブジェクトが多すぎる場合、JVMのGCが機能し始め、パフォーマンスが低下するため、コンテンツを変更する文字列に文字列を使用しないことが最善です。
StringBufferクラスを使用する場合、StringBufferオブジェクト自体は、新しいオブジェクトを生成してオブジェクト参照を変更する代わりに、毎回操作されます。したがって、ほとんどの場合、特に文字列オブジェクトがしばしば変更される場合は、StringBufferが推奨されます。
いくつかの特別な場合、文字列オブジェクトの文字列スプライシングは実際にJVMによってstringbufferオブジェクトのスプライシングとして解釈されるため、文字列オブジェクトの速度は、これらの時点ではstringbufferオブジェクトよりも遅くはありません。たとえば
文字列s1 = "これは" + "simple" + "テスト"のみです。 stringbuffer sb = new StringBuilder( "this is a a")。append( "simple")。append( "test");
文字列S1オブジェクトを生成することは、StringBufferよりも遅くありません。実際、JVMでは、次の変換が自動的に実行されます。
文字列s1 = "これは" + "simple" + "テスト"のみです。
JVMは上記のステートメントを直接扱います。
文字列S1 =「これは単純なテストのみです」。
したがって、速度は非常に高速です。ただし、スプライスされた文字列が別の文字列オブジェクトから来る場合、JVMは自動的に変換されず、速度はそれほど高速ではないことに注意してください。
文字列s2 = "これはa"; string s3 = "simple"; string s4 = "test"; string s1 = s2 + s3 + s4;
この時点で、JVMは元の方法で定期的にそれを行います。
ほとんどの場合、stringbuffer> string。
4.StringBufferとStringBuilder
2つの間にほとんど違いはありません。彼らは基本的に親クラスのさまざまな方法を呼び出しています。重要な違いは、StringBufferがスレッドセーフであることです。ほとんどの内部メソッドには、キーワードがその前に同期されているため、特定のパフォーマンス消費が引き起こされます。 StringBuilderは非読み取りセーフであるため、より効率的です。
public static void main(string [] args)スロー例外{string string = "0"; int n = 10000; long begin = system.currenttimemillis(); for(int i = 1; i <n; i ++){string+= i; } long end = system.currenttimemillis();長い= end -begin; System.out.println( "文字列クラスを使用して時間がかかる時間:" + + "ms"); int n1 = 10000; stringbuffer sb = new StringBuffer( "0"); long begin1 = system.currenttimemillis(); for(int j = 1; j <n1; j ++){sb.append(j); } long end1 = system.currenttimemillis();長い間= end1 -begin1; System.out.println( "stringbufferクラスを使用して時間がかかる時間:" + intering1 + "ms"); int n2 = 10000; stringbuilder sb2 = new StringBuilder( "0"); long begin2 = system.currenttimemillis(); for(int k = 1; k <n2; k ++){sb2.append(k); } long end2 = system.currenttimemillis();長い2 = end2 -begin2; System.out.println( "StringBuilderクラスを使用するのに時間がかかります:" + 2 + "MS"); }出力:
文字列クラスを使用する時間:982ms stringbufferクラスを使用する時間:2ms stringbuilderクラスを使用する時間:1ms
この数は毎回異なり、各マシンの状況は異なりますが、確実なポイントがいくつかあり、文字列クラスは他の2つよりも大幅に多く消費します。別のポイントは、StringBufferがStringBuilder以上の消費を消費することですが、違いは明らかではありません。
5つの使用戦略
(1)基本原則:少量のデータを操作する場合は、文字列を使用します。単一のスレッドで大量のデータを操作する場合は、StringBuilderを使用してください。マルチスレッドで大量のデータを操作する場合は、StringBufferを使用してください。
(2)頻繁なスプライシングには、文字列クラスの「+」を使用しないでください。パフォーマンスが非常に低い場合は、Javaの最適化において比較的重要な原則であるStringBufferまたはStringBuilderクラスを使用する必要があります。たとえば、文字列を使用する場合、文字列をスプライシングするときは、「+」を使用してJVMに一時的な文字列バッファオブジェクトを形成し、同時に各文字列にオブジェクトが作成されます。 2つの文字列をスプライシングした後、合計4つのオブジェクトを作成する必要があります! (結果を保持する文字列、2つの文字列オブジェクト、一時的な文字列バッファオブジェクト)。 StringBufferを使用する場合、2つのオブジェクトを作成するだけです!最後の結果を保持する文字列バッファオブジェクトと文字列オブジェクト。
(3)パフォーマンスを向上させるには、StirngbufferまたはStirngbuilderを構築するときに、できるだけ容量を指定する必要があります。もちろん、操作する文字列の長さが16文字を超えない場合、必要はありません。容量を指定しないと、パフォーマンスが大幅に減少します。
(4)StringBuilderは通常、メソッド内で使用され、同様の「+」関数を完了します。なぜなら ?スレッドセーフは、使用後に破棄することができます。 StringBufferは、主にグローバル変数で使用されています。
(5)同じ状況でStirngBuilderを使用すると、StringBufferを使用するのと比較して約10%〜15%のパフォーマンス改善を達成できますが、マルチスレッドが不安定なリスクが必要です。実際のモジュラープログラミングでは、特定のモジュールを担当するプログラマーは、モジュールがマルチスレッド環境に配置されるかどうかを明確に判断できない場合があります。したがって、StringBuilderは、システムのボトルネックがStringBuffer上にあることを確信していない場合を除き、マルチスレッドモードでモジュールが実行されないことを確認しない限り使用できます。それ以外の場合、StringBufferは引き続き使用されています。