ホームページ >Java >&#&チュートリアル >String、StringBuilder、StringBufferを理解する必要があります

String、StringBuilder、StringBufferを理解する必要があります

无忌哥哥
无忌哥哥オリジナル
2018-07-20 09:37:071317ブラウズ

String、StringBuilder、StringBuffer の 3 つのクラスの関係と違いは、Java では常に古典的な問題です

簡単な比較

  • 1. String: 文字定数。

  • StringBuilder: 文字変数

  • StringBuffer: 文字変数

String は定数型であり、すべてのプロパティも最終型として宣言されるため、String オブジェクトが作成されると、それを作成することはできません。変更されました;

StringBuilder / StringBuffer の 2 つのクラスは変数型であり、どちらも文字列の結合によって生成される中間オブジェクトが多すぎる問題を解決するために提供されたクラスです。 StringBuilder > 削除された StringBuffer にはスレッドセーフな部分があるため、オーバーヘッドが効果的に削減されます。したがって、ほとんどの場合、
StringBuilder が文字列の結合操作の最初の選択肢になります

  • 2. 文字列の文字列処理

    例 1:
  • String s = "abcd";
    s = s + "fgh";
  • このような文字列処理を行うとき、多くの人が String 型が変数であると誤解します。

    しかし、実際には、JVM がこのコードを処理するプロセスは次のとおりです。まず s オブジェクトを作成し、値「abcd」を割り当てます。次に、コードの 2 行目を処理するときに、別の s オブジェクトを作成し、値「abcdfgh」を割り当てます。 " を追加し、最初のオブジェクト ガベージ コレクションを追加します。
  • つまり、最初の s は変更されず、2 番目の s は新しいオブジェクトであることと同等です

    例 2:
  • String str = “This is only a” + “simple” + “test”;
このコードは、 String str = “This is just a simple test”;<p><strong>例 3:</strong><pre class="brush:php;toolbar:false;">String str2 = &quot;This is only a&quot;; String str3 = &quot;simple&quot;; String str4 = &quot;test&quot;; String str1 = str2 +str3 + str4;</pre></p>このコードも例 1 のプロセスに従って処理されます<h1></h1> 3 つの StringBuilder / StringBuffer 構築特性<h3></h3> これら 2 つのオブジェクトの構築プロセスでは、まずデフォルトに従って 1 つを適用します。 size 文字配列 (char[])、デフォルトの容量は 16 文字ですが、それを超える場合は、Arrays.copyOf() を使用して容量を 2 倍の 16、32、64、128... に拡張します。もちろん、これは影響します。オブジェクトは必要に応じてカスタマイズできます <p><pre class="brush:php;toolbar:false;">//默认 16 个字符 public StringBuilder() { super(16); } //构造函数定义容量 public StringBuilder(int capacity) { super(capacity); }</pre></p> 4. 文字列のスプライシング処理における String と StringBuilder の比較<p></p> 文字列のスプライシング操作には StringBuilder が推奨されていることは誰もが知っていますが、常に使用することが推奨されています。文字列連結の代わりにStringBuilder?明らかに違います。 <p></p>例 1: <h3><pre class="brush:php;toolbar:false;">String str = &quot;123&quot;; String str1 = str + &quot;456&quot;; String str2 = new StringBuilder().append(str).append(&quot;def&quot;).toString();</pre></h3> <p> この場合、2 つの処理方法の間に効率の差はほとんどありません<code>String str = “This is only a simple test”;

例三:

String str = "";
for (int i = 0; i < 1000; i++) {
    str += "12345";
}

StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    stringBuilder.append("12345");
}

这段代码同样会按照例一的过程来处理

三. StringBuilder / StringBuffer 构造特性

这两个对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128...,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量

String str1 = "123" + "456" + "789";

String str2 = new StringBuilder("123").append("456").append("789").toString();

四. String 与 StringBuilder 处理字符串拼接对比

我们都知道,进行字符串拼接操作时推荐使用 StringBuilder,但是是不是什么时候都推荐使用 StringBuilder 来代替 String 进行字符串拼接?显然不是的。

例一:

rrreee

在这种情况下,两种处理方式效率差别不大

JDK 8 中, String 的字符串拼接操作会被编译器自动转换为 StringBuilder 并调用 append 方法,由于这样的优化方案,使得两个类在这种情况下的处理效率差别不大;而在 JDK 9 中,为了更加统一字符串操作优化,提供了 StringConcatFactory,作为一个统一的入口,更加优化了字符串拼接操作。

例二:

rrreee

这种情况下,StringBuilder 更快

在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗。

简单来说,在循环中对同一个字符串对象做字符串拼接,优先选择 StringBuilder

例三

rrreee

这种情况下,String 更快

我们都知道 String str1 = "123" + "456" + "789"; 其实是等同于 String str1 = "123456789";

🎜 🎜JDK 8🎜 では、String の文字列結合操作はコンパイラによって StringBuilder に自動的に変換され、追加されますこのような最適化スキームにより、この場合、2 つのクラスの処理効率にほとんど差はありません。🎜JDK 9🎜 では、文字列操作をより均一に最適化するために、統一された入り口として StringConcatFactory が提供されます。文字列の連結操作がさらに最適化されています。 🎜🎜例 2: 🎜rrreee🎜🎜この場合、StringBuilder の方が速いです🎜🎜🎜 ループ内では、「+」が実行されるたびに String オブジェクトが作成されるため、オブジェクトの作成とリサイクル。 🎜🎜簡単に言うと、🎜ループ🎜内で同じ文字列オブジェクトを連結する場合、StringBuilderの方が優先されます🎜

例3

rrreee🎜🎜この場合、Stringの方が高速です🎜🎜🎜us String str1 = "123" + "456" + "789"; は実際には String str1 = "123456789"; と同等ですが、StringBuilder では append メソッドを複数回呼び出す必要があります。 。 🎜

以上がString、StringBuilder、StringBufferを理解する必要がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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