Javaの「等しい」および「==」の類似点
まず、「平等」と「==」について簡単に話しましょう
==操作2つの変数の値が基本データ型の等しいかどうかを比較します。
参照変数の場合、ヒープに保存されているアドレスが同じかどうかを意味します。
スタックのコンテンツは同じですか?
Equals操作によって表される2つの変数が同じオブジェクトへの参照であるかどうか、
つまり、ヒープ内のコンテンツが同じかどうかです。
要約すると、==は2つのオブジェクトのアドレスを比較しますが、2つのオブジェクトの内容を比較します。
文字列クラスを簡単に紹介します
文字列クラスは、不変の文字シーケンスとも呼ばれます
文字列は、プライベートファイナルチャーバリュー[]を使用して、文字列の保存を実現します。つまり、文字列オブジェクトが作成された後、このオブジェクトに保存されている文字列コンテンツを変更できません。文字列クラスには特別な作成方法があります。これは、「」ダブル引用符を使用して作成することです。たとえば、new String( "123")は実際に2つの文字列オブジェクトを作成し、1つは「123」によって作成され、 "double Quotes、もう1つはnewによって作成されます。ただし、それらが作成する期間は異なり、1つはコンピレーション期間、もう1つは実行期間です。 Javaは、文字列タイプに +演算子を過負荷にし、 +を直接使用して2つの文字列を連結できます。ランタイム中に文字列クラスのインターン()メソッドを呼び出すと、ストリングプールにオブジェクトを動的に追加できます。
文字列オブジェクトを作成する2つの方法 ""とnew()を区別します
文字列は特別なパッケージデータです。使用できます:
string str1 = new String( "123"); string str2 = "123";
2つのフォームを作成します
最初のものは、new()を使用して新しいオブジェクトを作成することです。これはヒープに保存されます。新しいオブジェクトが呼び出されるたびに作成されます。 (上記のように実際には2つですが、一定のプールに「123」が存在した後、新しい「123」は一定のプールに作成されなくなります)
2番目のタイプは、最初にスタック内の文字列クラスのオブジェクトに可変STRを作成し、次に象徴的な参照を使用して、文字列定数プールに「ABC」があるかどうかを調べることです。そうでない場合は、「ABC」を文字列定数プールに保存し、strを「ABC」を指します。既に「ABC」がある場合は、STRを「ABC」を直接指すようにします。
現時点では注意を払う必要があります
一方では、最初の執筆方法は有益であり、メモリスペースを保存します。同時に、JVMはスタック内のデータの実際の状況に基づいて新しいオブジェクトを作成する必要があるかどうかを自動的に決定するため、プログラムの実行速度をある程度改善できます。 string str = new String( "123");のコードの場合、String値が等しいかどうか、新しいオブジェクトを作成する必要があるかどうかに関係なく、新しいオブジェクトがヒープに作成され、プログラムの負担が増加します。一方、文字列str = "123"などの形式を使用してクラスを定義する場合、文字列クラスのオブジェクトSTRを作成することを常に当たり前のことと考えています。
オブジェクトは作成されていない可能性があります!そして、以前に作成されたオブジェクトを指すだけかもしれません。新しい()メソッドを介してのみ、毎回新しいオブジェクトが作成されるようにすることができます。
次の例をご覧ください
パッケージテストストリング;パブリッククラスのテストストリング{public static void main(string [] args){string a = "123";文字列b = "123"; System.out.println(a == b); System.out.println(A.Equals(b)); System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Andヒープ内の2つの参照オブジェクトは同じです。 System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- But c is dヒープと同じなので、c。equals(d)はtrue */ string e = "a1"です。文字列f = "a" +1; System.out.println(e == f); System.out.println(E.Equals(f)); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Java自体は、C ++とは異なり、オペレーターのオーバーロードを使用できます"h"; System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!