[AVA]Stringと==演算、String'+'演算とStringBuilder、StringBufferの違い
6840 ワード
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.結論
リファレンス
[Ava]String、StringBuffer、StringBuilderの違いとメリットとデメリット
StringBuilderとStringBufferの違いは何ですか?
Reference
この問題について([AVA]Stringと==演算、String'+'演算とStringBuilder、StringBufferの違い), 我々は、より多くの情報をここで見つけました https://velog.io/@gkdud583/JAVA-String과-연산-String-연산과-StringBuilder-StringBuffer의-차이점テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol