String、StringBuilder、StringBuffer の 3 つのクラスの関係と違いは、Java では常に古典的な問題です
1. String: 文字定数。
StringBuilder / StringBuffer の 2 つのクラスは変数型であり、どちらも文字列の結合によって生成される中間オブジェクトが多すぎる問題を解決するために提供されたクラスです。 StringBuilder > 削除された StringBuffer にはスレッドセーフな部分があるため、オーバーヘッドが効果的に削減されます。したがって、ほとんどの場合、
StringBuilder が文字列の結合操作の最初の選択肢になります
String s = "abcd"; s = s + "fgh";
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 = "This is only a";
String str3 = "simple";
String str4 = "test";
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 = "123";
String str1 = str + "456";
String str2 = new StringBuilder().append(str).append("def").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"); }
这段代码同样会按照例一的过程来处理
这两个对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128...,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量
String str1 = "123" + "456" + "789"; String str2 = new StringBuilder("123").append("456").append("789").toString();
我们都知道,进行字符串拼接操作时推荐使用 StringBuilder,但是是不是什么时候都推荐使用 StringBuilder 来代替 String 进行字符串拼接?显然不是的。
在这种情况下,两种处理方式效率差别不大
在 JDK 8 中, String 的字符串拼接操作会被编译器自动转换为 StringBuilder 并调用 append 方法,由于这样的优化方案,使得两个类在这种情况下的处理效率差别不大;而在 JDK 9 中,为了更加统一字符串操作优化,提供了 StringConcatFactory,作为一个统一的入口,更加优化了字符串拼接操作。
这种情况下,StringBuilder 更快
在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗。
简单来说,在循环中对同一个字符串对象做字符串拼接,优先选择 StringBuilder
这种情况下,String 更快
我们都知道 String str1 = "123" + "456" + "789";
其实是等同于 String str1 = "123456789";
String str1 = "123" + "456" + "789";
は実際には String str1 = "123456789";
と同等ですが、StringBuilder では append メソッドを複数回呼び出す必要があります。 。 🎜以上がString、StringBuilder、StringBufferを理解する必要がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。