javaのStringとStringBuilderの違い

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

私は誰もがStringとStringBufferの違いをよく理解していると信じていますが、まだこの2つのクラスの動作原理が不明な仲間がたくさんいると推測されています。 J2SE 5.0によってもたらされた新しい文字操作クラス – StringBuilder(私のブリックを投げようとしないでください、私はまだ目が覚めています、ここではC#について話していません、JavaもStringBuilderクラスを持っています)。 では、このStringBuilderとStringBufferとの初期のStringクラスとの違いは何ですか? 異なる機会にどちらを使うべきですか? 私はこれらのタイプの授業について私自身の見解を話しています。誰もが間違った場所を持ち、間違いを犯しながら学ぶよい機会です。

要するに、String型とStringBuffer型の主なパフォーマンスの違いは、Stringは不変であるということです(なぜ、Javaのデザイナーに問い合わせてください、Stringはネイティブ型ではありませんか?)だから、Stringの型を変更するたびに時間は実際には新しいStringオブジェクトを生成してから新しいStringオブジェクトを指すのと同じです。したがって、オブジェクトの各世代が特にメモリの影響を受けるため、String Stringを頻繁に使用しないことをお勧めします参照オブジェクトがなくなると、JVMのGCが動作し始め、速度はかなり遅くなります。 試しにはあまり適していない例を以下に示します。

文字列S1 = "abc";
For(int I = 0; I <10000; I ++)//シミュレーションプログラムへの複数の呼び出し
{
S1 + = "def";
S1 = "abc";
}

この場合、forループが終了した後、メモリ内のオブジェクトがGCによってクリーンアップされていない場合、メモリに2万以上の驚くべき数があります。これが多くの人が使用するシステムであれば、その数はそれほど多くないので、誰もがそれを使用するときに注意する必要があります。

StringBufferクラスを使用する場合、結果は同じではありません。各結果は、新しいオブジェクトを生成してオブジェクト参照を変更する代わりに、StringBufferオブジェクト自体で動作します。 ですから、一般的にStringBufferを使うことをお勧めします。 特殊なケースでは、Stringオブジェクトの文字列連結は実際にはJVMによってStringBufferオブジェクトの連結として解釈されるため、Stringオブジェクトの速度はStringBufferオブジェクトより遅くならず、特に次の文字列オブジェクト生成よりも遅くなりません。 、Stringの効率はStringBufferよりはるかに高速です:

文字列S1 = "これは単なる" + "単純な" + "テストです。
StringBuffer Sb = new StringBuilder( "これはa")。append( "simple")。append( "test");

String S1オブジェクトの生成速度が速すぎることに驚いています。現時点では、StringBufferは実際には速度上の利点はありません。 実際、これはJVMのトリックです.JVMの目には、これは

ストリングS1 = "これは単に" + "単純な" + "テスト";実際には:ストリングS1 = "これは単なるテストに過ぎない"ので、時間はあまり必要ありません。 しかし、あなたの文字列が別のStringオブジェクトのものであれば、スピードはそれほど速くはありません:

文字列S2 = "これは単なるものです";
文字列S3 = "シンプル";
文字列S4 = "テスト";
文字列S1 = S2 + S3 + S4;

現時点では、JVMは元のルールに従って動作しますが、S1オブジェクトの生成速度は今の速度ほど遅くはありません。

このことから、最初の結論が得られます。ほとんどの場合、StringBuffer> String

そして、StringBuilderはどのようにそれらと比較しますか? まず、簡単に紹介すると、StringBuilderはJDK5.0の新しく追加されたクラスです。これはStringBufferとは異なり、次の紹介(ソースJavaWorld)を参照してください。

Java.lang.StringBufferスレッドセーフな可変文字シーケンスです。 Stringと似た文字列バッファですが、変更することはできません。 文字列バッファは、複数のスレッドに対して安全に使用できます。 これらのメソッドは、必要に応じて同期させることができるため、特定のインスタンスに対するすべての操作は、関連する各スレッドによって実行されるメソッド呼び出しと同じ順序で、シリアルの順序で行われるように見えます。

各文字列バッファには一定の容量があります。 文字列バッファに含まれる文字シーケンスの長さがこの容量を超えない限り、新しい内部バッファ配列を割り当てる必要はありません。 内部バッファーがオーバーフローした場合、この容量は自動的に増加します。 JDK 5.0以降、単一のスレッドStringBuilderに相当するクラスがクラスに追加されました。 このクラスとは対照的に、StringBuilderクラスはすべて同じ操作をサポートしているため、通常は優先されるべきですが、同期を実行しないため、より高速です。

ただし、複数のスレッドに対してStringBuilderのインスタンスを使用することは安全ではありません。 このような同期化のためには、StringBufferを使用することをお勧めします。

このようにして、誰もが彼らの違いを理解できると推測されます。次に、一般的な控除を行います:

ほとんどの場合、StringBuilder> StringBuffer

したがって、この不等式の転送定理に従って:ほとんどの場合、StringBuilder> StringBuffer> String(操作の数が多いほど、より安定します)。

システム時間を取得するlong start = System.currentTimeMillis(); long end = System.currentTimeMillis();
コードを次のようにコピーします。
javax.swing.JOptionPaneをインポートします。
パブリッククラスT1 {
パブリックstatic void main(String args []){
文字列str;
文字列str2;
Int i;
StringBuffer sb =新しいStringBuffer();
Str = JOptionPane.showInputDialog(null、 "文字列を入力");

For(i = 0; i <str.length()/ 2; i ++)
if(str.charAt(i)!= str.charAt(str.length() – i-1))
休憩。

if(i> = str.length()/ 2)
JOptionPane.showMessageDialog(null、 "palindrome"です)。
その他
JOptionPane.showMessageDialog(null、 "palindromeではありません");

}

}

非文字および非数字の文字を無視して、回文を決定する
コードを次のようにコピーします。
javax.swing.JOptionPaneをインポートします。
パブリッククラスT2 {
パブリックstatic void main(String args []){
文字列str;
文字列str2;
Int i;
StringBuffer sb =新しいStringBuffer();
Str = JOptionPane.showInputDialog(null、 "文字列を入力");
For(i = 0; i <str.length(); i ++)
{
If(Character.isLetterOrDigit(str.charAt(i)))
Sb.append(str.charAt(i));
}
Str = sb.toString();
Str2 = sb.reverse()。toString();
/ *
For(i = 0; i <str.length()/ 2; i ++)
if(str.charAt(i)!= str.charAt(str.length() – i-1))
休憩。

* /
もし(str.equals(str2))
JOptionPane.showMessageDialog(null、 "palindrome"です)。
その他
JOptionPane.showMessageDialog(null、 "palindromeではありません");

}

}


1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ