JavaでのStringとStringBuilderの違い
この投稿では、文字列との違いについて説明します StringBuilder
(また StringBuffer
)Javaで。
1.可変性
文字列はJavaでは不変ですが、 StringBuilder
Javaでは変更可能です。不変オブジェクトとは、作成後にコンテンツを変更できないオブジェクトです。
2つのJava文字列を連結しようとすると、新しいStringオブジェクトが文字列プールに作成されます。これは、比較することで実証できます HashCode
すべての連結操作後のStringオブジェクトの場合。
1 2 3 4 5 6 7 8 9 10 |
class Main { public static void main(String[] args) { String s = "AB"; System.out.println(s.hashCode()); s += "C"; System.out.println(s.hashCode()); } } |
出力:
2081
64578
上記のコードから明らかなように、連結後に新しいハッシュコードが生成され、更新された値で新しいStringオブジェクトが作成され、古いオブジェクトが逆参照されたことを証明します。
2.平等
使用できます equals()
以来、Javaで2つの文字列を比較するためのメソッド String
クラスは equals()
の方法 Object
クラス、 StringBuilder
をオーバーライドしません equals()
の方法 Object
クラス、したがって equals()
メソッドを使用して2つを比較することはできません StringBuilder
オブジェクト。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Main { private static final String STR = "ABC"; public static void main(String[] args) { String s1 = new String(STR); String s2 = new String(STR); System.out.println(s1.equals(s2)); StringBuilder sb1 = new StringBuilder(STR); StringBuilder sb2 = new StringBuilder(STR); System.out.println(sb1.equals(sb2)); } } |
出力:
true
false
3.比較可能
The String
クラスは Comparable
インターフェース、 StringBuilder
そうではありません。説明のために、次のコードを考えてみましょう。 ClassCastException
以来 StringBuilder
文字列比較のメカニズムは提供していません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.Set; import java.util.TreeSet; class Main { public static void main(String[] args) { Set<String> colors = new TreeSet<>(); colors.add(new String("Red")); colors.add(new String("Blue")); colors.add(new String("green")); Set<StringBuilder> codes = new TreeSet<>(); try { codes.add(new StringBuilder("#008200")); codes.add(new StringBuilder("#ff0000")); codes.add(new StringBuilder("#006400")); } catch (ClassCastException ex) { System.out.println(ex.getMessage()); } } } |
出力:
java.lang.StringBuilder cannot be cast to java.lang.Comparable
4.コンストラクター
新しい演算子を使用せずにStringオブジェクトを作成できます。これは、 StringBuilder
.
1 |
String str = "abc"; |
と同等です:
1 2 |
char[] data = {'a', 'b', 'c'}; String str = new String(data); |
5.パフォーマンス
StringBuilder
は高速で、連結の実行中に文字列よりも少ないメモリを消費します。これは、Javaでは文字列が不変であり、2つの文字列オブジェクトを連結するには新しいオブジェクトを作成する必要があるためです。
説明のために、文字列と文字列の両方にかかった時間をログに記録する次のコードについて考えてみます。 StringBuilder
複数の連結上のオブジェクト。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
class Main { private static final String STR = "A"; public static String stringConcatenation() { String s = STR; for (int i = 0; i < Short.MAX_VALUE; i++) { s = s + STR; } return s; } public static String stringBufferConcatenation() { StringBuilder sb = new StringBuilder(STR); for (int i = 0; i < Short.MAX_VALUE; i++) { sb.append(STR); } return sb.toString(); } public static void main(String[] args) { long start = System.nanoTime(); stringConcatenation(); long end = System.nanoTime(); System.out.println("The time taken by string concatenation: " + (end - start) + "ns"); start = System.nanoTime(); stringBufferConcatenation(); end = System.nanoTime(); System.out.println("The time taken by StringBuilder concatenation: " + (end - start) + "ns"); } } |
出力(変化します):
The time taken by string concatenation: 504774386ns
The time taken by StringBuilder concatenation: 1081315ns
6.長さ
文字列は不変であるため、その長さは固定されています。しかし StringBuilder
持っている setLength()
メソッド、変更することができます StringBuilder
指定された長さのオブジェクト。
文字列を使用する場合と StringBuilder
?
文字列は、不変性が必要な場合、または連結操作が不要な場合に使用できます。 A StringBuilder
途中で大量の文字列を作成するというパフォーマンスのオーバーヘッドなしに、可変の文字列が必要な場合に使用できます。
これは、JavaのStringとStringBuilderの違いに関するものです。