この投稿では、文字列との違いについて説明します StringBuilder (また StringBuffer)Javaで。

1.可変性

文字列はJavaでは不変ですが、 StringBuilder Javaでは変更可能です。不変オブジェクトとは、作成後にコンテンツを変更できないオブジェクトです。

2つのJava文字列を連結しようとすると、新しいStringオブジェクトが文字列プールに作成されます。これは、比較することで実証できます HashCode すべての連結操作後のStringオブジェクトの場合。

ダウンロード  コードを実行する

出力:

2081
64578

 
上記のコードから明らかなように、連結後に新しいハッシュコードが生成され、更新された値で新しいStringオブジェクトが作成され、古いオブジェクトが逆参照されたことを証明します。

2.平等

使用できます equals() 以来、Javaで2つの文字列を比較するためのメソッド String クラスは equals() の方法 Object クラス、 StringBuilder をオーバーライドしません equals() の方法 Object クラス、したがって equals() メソッドを使用して2つを比較することはできません StringBuilder オブジェクト。

ダウンロード  コードを実行する

出力:

true
false

3.比較可能

The String クラスは Comparable インターフェース、 StringBuilder そうではありません。説明のために、次のコードを考えてみましょう。 ClassCastException 以来 StringBuilder 文字列比較のメカニズムは提供していません。

ダウンロード  コードを実行する

出力:

java.lang.StringBuilder cannot be cast to java.lang.Comparable

4.コンストラクター

新しい演算子を使用せずにStringオブジェクトを作成できます。これは、 StringBuilder.

と同等です:

5.パフォーマンス

StringBuilder は高速で、連結の実行中に文字列よりも少ないメモリを消費します。これは、Javaでは文字列が不変であり、2つの文字列オブジェクトを連結するには新しいオブジェクトを作成する必要があるためです。

説明のために、文字列と文字列の両方にかかった時間をログに記録する次のコードについて考えてみます。 StringBuilder 複数の連結上のオブジェクト。

ダウンロード  コードを実行する

出力(変化します):

The time taken by string concatenation: 504774386ns
The time taken by StringBuilder concatenation: 1081315ns

6.長さ

文字列は不変であるため、その長さは固定されています。しかし StringBuilder 持っている setLength() メソッド、変更することができます StringBuilder 指定された長さのオブジェクト。

文字列を使用する場合と StringBuilder?

文字列は、不変性が必要な場合、または連結操作が不要な場合に使用できます。 A StringBuilder 途中で大量の文字列を作成するというパフォーマンスのオーバーヘッドなしに、可変の文字列が必要な場合に使用できます。

これは、JavaのStringとStringBuilderの違いに関するものです。