ビープ
最近、基礎知識を固めるために面接の質問を使いたいと思っています。多くの面接の質問の要約では、「イコールと == の違い」の頻度は一般的に高くありません。ただし、自分のプログラミングでは時々別の使い方をしています。どちらもですが、深い考察なので、両者の違いを見てみましょう。(結論を参照して、最後のセクション [概要] に直接進みます)
本質を見てください
まず、両方の機能を比較しますが、本質と使用方法には、依然として 2 つの間に大きな違いがあります。
-
本質的には、
==
これは Java の演算子ですequals()
がオブジェクト クラスを比較するためのメソッドであり、根本的に異なります。 -
使用中: 日常の開発において、両者が等しいかどうかを比較する場合に両方がよく登場しますが、両者が適用できるシナリオはまったく異なります
==
。equals()
まずは「==」を見てください。
まず、比較に「==」が使用される場合、いくつかの異なる状況が考えられます。
- 両側が参照型 (カプセル化型)
- 両面ベーシックタイプ
片側は参照型、もう一方はプリミティブ型です。
両面ベーシックタイプ
==
両側が基本型の場合、==
次の例のように、2 つの値が等しいかどうかを比較する機能です。
int a = 1222;
int b = 1222;
System.out.println(a == b);
输出:
true
Java 基本型 int の 2 つの変数 a と b の値は両方とも 1222 であるため、出力は true になります。同じことが Java の他のすべてのプリミティブ型に当てはまります。
Java の基本的なタイプには次のものがあります。
- 数値タイプ: 整数バイト、short、int、long、浮動小数点数: double、float
- 文字の種類: char
- ブール型: ブール型
両側は参照 (カプセル化) タイプです
==
双方が参照(カプセル化)型の場合、比較は参照が同じかどうか、つまり値が同じかどうかの比較に加えて、値が格納されているメモリアドレスかどうかも比較する必要があります。の位置は同じです。
ほとんどの参照型では、キーワードが新しいオブジェクトの作成に使用されている限りnew
、オブジェクトの参照アドレスも新しいアドレスになり、それを使用して得られる結果は==
常に false になります。
最初のオブジェクトが new を使用し、最初のオブジェクトが 2 番目のオブジェクトに直接コピーされる場合、最初のオブジェクトと 2 番目のオブジェクトは同じオブジェクトを指し、waiting の使用は常に true になります==
。
上記の 2 つの一般的な状況に加えて、異なるタイプが定義される場合には、いくつかの異なる状況を考慮する必要があります。ここでは、一般的に使用されるいくつかのカプセル化タイプに焦点を当てます。
- 文字列型
String の場合は、文字列定数プールの概念を導入する必要があります。具体的な内容は自分で検索して理解することができます。今後、関連記事を作成します。最初にフラグを設定してから、戻ってきてアドレスを投稿します。ここでいくつかのことを理解する必要があります。
パフォーマンスを向上させ、メモリのオーバーヘッドを削減するために、JVM は文字列定数をインスタンス化するときに一連の最適化操作を実行します。
- JVM レベルで文字列の文字列定数プールを提供します。これはキャッシュ領域として理解できます。
- 文字列定数を作成するとき、JVM はその文字列が文字列定数プールに存在するかどうかを確認します。
- 文字列が文字列定数プールに存在する場合は、参照インスタンスが直接返されます。存在しない場合は、最初に文字列がインスタンス化され、次回アクセスしたときに直接使用できるように、その文字列が文字列定数プールに入れられます。キャッシュを高速に使用する効果が得られます。
たとえば、次のコード:
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
输出:
true
この状況は、前述の文字列定数プール文にも当てはまります。まず、str1 を定義するときに、定数プールに文字列「Hello」があるかどうかを確認し、ない場合は、新しいオブジェクト「Hello」を作成して保存します。そして、str2 を定義するときに、文字列 "Hello" が定数プールにすでに存在することが検出され、str2 もこの文字列を指し、この時点で str1 の値と参照が表示されます。と str2 は一致しているので、 == を使用すると比較します。 true の場合が表示されます。
- 基本タイプの対応パッケージタイプ
基本タイプのカプセル化タイプの対応表は以下のとおりです。
基本タイプ | 対応パッケージタイプ |
---|---|
チャー | キャラクター |
ブール値 | ブール値 |
浮く | 浮く |
バイト | バイト |
ダブル | ダブル |
整数 | 整数 |
短い | 短い |
長さ | 長さ |
これらの基本型のカプセル化型については、Java 言語仕様で==
次のような文を見つけました。
一般的な意味は次のとおりです。
==
両辺がInteger型の場合、-128~127の範囲で値が等しい場合はtrueを返し、それ以外の場合はtrueを返します。==
両側がCharacter型の場合、\u0000~\u007fの範囲内で値が等しい場合はtrueを返し、それ以外の場合はtrueを返します。==
両辺がブール型の場合、値が等しい場合に true を返します。
上記範囲の値はメモリに直接キャッシュされますが、直接代入の場合はすべてキャッシュされたオブジェクトを指すため、上記範囲の値が等しい場合は true を返します==
。
整数:
Integer i1 = 122;
Integer i2 = 122;
System.out.println(i1 == i2);
Integer i3 = 1222;
Integer i4 = 1222;
System.out.println(i3 == i4);
输出:
true
false
キャラクター:
Character c1 = '\u0002';
Character c2 = '\u0002';
System.out.println(c1 == c2);
Character c3 = '\u00ff';
Character c4 = '\u00ff';
System.out.println(c3 == c4);
输出:
true
false
ブール値:
Boolean b1 = true;
Boolean b2 = true;
System.out.println(b1 == b2);
输出:
true
もう一度equals()を見てください
equals()
通常、参照型の比較に使用され、比較的理解しやすいステートメントです。equals()
これは Java の Object クラスの一般的なメソッドであり、次のように記述されます。
public boolean equals(Object obj) {
return (this == obj);
}
equals()
このことから、デフォルトでは、の演算がまだ使用されている==
ため、 と の関数は一貫していることがわかります2 つの参照型の使用については、参照はデフォルトでも比較されます この時点では、説明の一部のみが必要ですので、検討してください。equals()
==
equals()
==
ただし、ほとんどの参照型は書き換えられますequals()
。たとえば、前のセクションで紹介した Integer や String などの一部の Java 組み込み参照型や、独自に定義した一部の参照型は、通常、値を比較するために書き換えられますequals()
。たとえば、次はequals()
String 型の定義です。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
他の同様の基本型の対応する参照型にequals()
も独自の定義があるため、ここでは詳しく説明しません。ご自身で確認してください。
結論は
対象==
:
- 基本タイプ: 値が同じかどうかを比較します。
- 参照タイプ: 比較は参照が同じかどうかです。
の場合equals()
:
基本的には==
エフェクトと同じですが、値の比較として書き換えられることが多いため、equals()
通常は値の比較に使用されます。