[Java]StringとStringBuilderとStringBuffer?


始まる前に



StringBuilderの使用を習得してこそ、アルゴリズムの問題で便利に使用できます.
面接では、StringBuilderとStringの違いが分かれば、うまく答えることができます.
だからこの文章では、StringとStringBuilderの違いを知りたいです.

String


Javaの基本型は全部で8種類あります.
タイプタイプデータ型範囲サイズ論理型booleanfalse、True 1 byte文字型char<00~uffff(0~65535)2 byte整数型byte-128~12717 byte「short-32768~32767 byte」「int-217474833648-21783674」「long-9223372036203668547758088~-9223372036685477580858088~-92372036685477580888 byte実数型float 1」.4E-45 ~ 3.4E384byte''double4.9E-324 ~ 1.8E3088byte
1.4 E−45のようなマークは、Eの前の1.4に10−45を乗じたものである.
-45回は1/10に45回乗算されます.
うん.しかし、基本型Stringはどこにあるのでしょうか.このように聞くことができます.StringはJava基本型ではありません.基本型の特徴を持つ参照型.基本型の特徴は下から見ることができます.
String str = "abc";
元のクラスを使用してオブジェクトを作成するには、次の手順に従います.
String str = new String("abc");
しかし、そうしなくても生成でき、基本型の特徴はあるものの、参照型の特殊なやつになってしまう.参照型という言葉がよく分からない場合は、NAVERブログを参照してください.
OracleのString公式文書を参照すると、次のことがわかります.
Stringの概要
  • Javaプログラム内のすべての文字列エンティティ(ex.「abc」)は、クラスインスタンスによって実装される.
  • 文字列は固定されています.値を作成した後は、変更できません.
  • 文字列バッファ
  • は、可変文字列をサポートする.
  • Stringオブジェクトは変更できませんので、共有できます.
  • ここを見て、二つ目はちょっと変な文です.文字列は固定されていますが、値を作成した後は変更できませんか?
    String abc = "abc";
    abc = abc + "asdfasdf";
    これを見るとabcは変化が見えますが、文字列を変えることはできませんか?
    ああ!abcは文字列ではなく文字列変数であることがわかり、「abc」と「asdfasdf」は消えず値を変更できない文字列であることがわかります.
    Stringでできること
  • Stringでは、シーケンス内の単一の文字を確認できます.(charAt)
  • 文字列を比較できます.(compareTo)
  • 文字列を検索できます.(contains, indexOf)
  • サブ文字列を抽出できます.(substring)
  • は、すべての文字が大文字または小文字に変換された文字列のコピーを作成することができる.(toLowerCase, toUpperCase)
  • Stringでは文字列自体を変更または削除することはできません.ただし、別の文字列を作成するには、ある文字列から文字列を抽出してオブジェクトを作成またはコピーします.
    Stringは、値を変更できない文字列オブジェクトを生成します.もし私がユーザーから文字列を受け取って、操作した値を出力したいなら、どうすればいいですか?
    ここで、値は最後の文字の値を削除する必要があると仮定します.
    abcd、sdlfsl、pelix、mavenと入力しました.最後の文字を削除するには、substringメソッドを使用して文字列の最後の文字を抽出します.

    必要な値はabc、sdlfs、peli、maveであり、abcd、sdlfsl、pelix、mavenもメモリ領域を占めています.
    すなわち,文字列の追加,修正,削除などを頻繁に行うアルゴリズムでは,Stringを用いるとスタックメモリが浪費される.

    StringBuilder


    StringBuilderは、Stringを追加することで、スタックメモリ内の文字列を変更できます.
    StringBuilder sb= new StringBuilder("hello"); 
    sb.append(" world");

    Stringを使用すると、「hello」と「world」、「hello world」の合計3文字列が生成されますが、StringBuilderで生成して文字列を加えると、結果として1文字列しか生成されません.
    メモリの消費量が少ないため、文字列演算を多く行うことができます.
    さらにappend、insert、delete演算も提供され、これを実現する.
  • append(a):文字列データの追加、a後接.
  • insert(a,b):中間文字列を挿入し、ほぼaがオフセット量、bが挿入するデータである.
  • deleteCharAt(a):中間文字は1つのみ削除できます.
  • StringBuffer?


    StringBufferはStringBuilderと同じですが、マルチスレッド環境をサポートします.IfUWannaが書いた文章を参照してください.
    最大の違いは、同期がないことです.StringBufferは同期キーワードをサポートし、マルチスレッド環境では安全です(thread-safe).Stringは、不変性を有するため、マルチスレッド環境における安定性(thread−safe)も同様であることに注意してください.
    StringBuilderは、StringBufferよりもシングルスレッド環境でパフォーマンスが優れているという利点があります.

    の最後の部分


    整理する
    String:文字列演算量が小さく、マルチスレッド環境の場合
    StringBuffer:マルチスレッド環境での文字列演算量が大きい
    StringBuilder:文字列演算量が多く、単一スレッドでも同期を考慮しなくてもよい
    これを機にStringBuilderだけでなくStringBufferとの違いも知り、収穫がありました.ただアルゴリズムの問題で、「Stringはなぜ最後の文字の削除や文字の追加を実現しなかったのか!?面倒くさいなぁ~」という疑問から始まる文章は、収穫が多いようです.
    観客の皆さんにもたくさんもらえたらいいなと思います

    リファレンス


    String公式文書
    参照タイプと参照変数(Reference Variable)-異機種間
    [Ava]String、StringBuffer、StringBuilder差異およびメリットとデメリット-IfUWanna