[AVA]Stringと==演算、String'+'演算とStringBuilder、StringBufferの違い


Stringと==演算


"=="を使用すると、Javaはインスタンスの参照値を比較します.
したがって、比較対象の場合は以下のようになります.equals()メソッドを使用して上書きします.
class Int {
    int a = 100;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Int anInt = (Int) o;
        return a == anInt.a;
    }

    @Override
    public int hashCode() {
        return Objects.hash(a);
    }
}
StringはJavaで文字列を処理するオブジェクトです.
Stringを比較するときに==演算を使用すると、結果はどうなりますか?
String a = "Hello World";
String b = "Hello World";

System.out.println(a == b);
Javaでは「==」が参照比較なのでfalseは出力されますか?
結果はtrueです.
Stringフォントを使用して作成すると、JavaはString値をスタック領域のConstant Poolに保存し、再使用します.
aとbは同じ文字列「Hello World」を持つ.
メモリ容量を共有します.
したがって、当然、aとbは同じ参照値を有するので、"=="比較ではtrueが現れる.

String"+"演算


上では、Java StringがConstant Poolを使用していることを発見しました.
では、文字列に「+」演算を使用すると、文字列は既存の指向メモリに追加されますか?


いいえ.
Java Stringで「+」演算を使用する場合、文字列は新しいメモリ領域に格納され、そのメモリ領域を指す構造で文字列が再生成されます.

したがって、String BuilderとStringBufferは、複数の文字列演算が必要な場合に使用します.Stringと+の演算よりもサイズの変化が柔軟です.

StringBuilderとStringBufferの違い


文字列演算では、Stringオブジェクトや+(+)演算よりもString BuilderやStringBufferを使用する方がメモリ効率が高くなります.
では、StringBuilderとStringBufferの違いは何でしょうか.
Synchronizationでは相違があります.
StringBufferは同期をサポートし、StringBuilderは同期をサポートしません.
@Override
@HotSpotIntrinsicCandidate
public synchronized StringBuffer append(String str) {
	toStringCache = null;
	super.append(str);
	return this;
}
synchronizedキーワードは、複数のスレッドが1つのリソースにアクセスしようとしたときに他のスレッドがデータにアクセスできないことを防止しますが、現在データを使用しているスレッドを除きます.
たとえば、Aスレッドがappend()同期ブロックにアクセスして実行すると、Bスレッドはappend()同期ブロックにアクセスできず、ブロック状態になります.
後続のAスレッドがappend()同期ブロックを終了すると、Bスレッド
実行状態になり、append()同期ブロックにアクセスできます.
StringBuilderは同期をサポートしていないため、単一スレッド環境ではStringBufferよりもパフォーマンスが優れています.

n/a.結論

  • 不変の文字列が必要な場合はStringを使用します.
  • シングルスレッド環境で文字列演算が頻繁に発生する場合、StringBuilder
  • を使用する.
  • マルチスレッド環境で文字列演算が頻繁に発生する場合、StringBuffer
  • を使用する.

    リファレンス


    [Ava]String、StringBuffer、StringBuilderの違いとメリットとデメリット
    StringBuilderとStringBufferの違いは何ですか?