Java のデータ型は、次の 2 つのカテゴリに分類できます。
1. 基本データ型。プリミティブ データ型とも呼ばれます。 byte、short、char、int、long、float、double、boolean を比較するには、二重等号 (==) を使用して、それらの値を比較します。
2. 複合データ型 (クラス) (==) を使用して比較する場合、それらはメモリ内の格納アドレスと比較されます。したがって、それらが同じ新しいオブジェクトでない限り、比較の結果は true になります。結果は偽です。 JAVA のすべてのクラスは、基本クラス Object を継承します。Object の基本クラスは、オブジェクトのメモリ アドレスを比較することを定義します。ただし、String などの一部のクラス ライブラリでは、このメソッドはオーバーライドされます。 、Integer、および Date、equals は、ヒープ メモリ内のクラスのストレージ アドレスを比較するのではなく、これらのクラスに独自の実装を持っています。 複合データ型間の等価比較の場合、equals メソッドをオーバーライドせずに、複合データ型間の比較はメモリ内の格納場所のアドレス値に基づいて行われます。これは、Object の equals メソッドでも二重等号 ( ==) が比較されるためです。 , したがって、比較の結果は、2 つの等号 (==) の結果と同じになります。
次のようにコードをコピーします。
パブリッククラス TestString {
publicstaticvoid main(String[] args) {
文字列 s1="月曜日";
文字列 s2="月曜日";
if (s1 == s2)
{
System.out.println("s1 == s2");}
それ以外{
System.out.println("s1 != s2");}
}
}
プログラムをコンパイルして実行すると、出力: s1 == s2 注: s1 と s2 は同じ String オブジェクト、つまり「Monday」を参照します。 2. プログラムを少し変更すると、さらに奇妙なことがわかります。
次のようにコードをコピーします。
パブリッククラス TestString {
publicstaticvoid main(String[] args)
{
文字列 s1="月曜日";
String s2 =new String("月曜日");
if (s1 == s2) {System.out.println("s1 == s2");
}
それ以外
{
System.out.println("s1 != s2");
}
if (s1.equals(s2))
{
System.out.println("s1 は s2 と等しい");
}
それ以外
{
System.out.println("s1 が s2 と等しくない");
}
}
}
new 演算子を使用して、s2 のプログラム出力を作成します。 s1 != s2 s1 は s2 に等しい 注: s1 と s2 は、それぞれ 2 つの「Monday」String オブジェクトを参照します。
3. 文字列バッファ プール プログラムは実行中に文字列バッファ プールを作成することがわかりました。s2 = "Monday" などの式を使用して文字列を作成する場合、プログラムはまず文字列内で同じ値を検索します。最初のプログラムでは、s1 が最初にプールに入れられたため、プログラムは同じ値を持つ s1 を見つけ、2 番目のプログラムで s1 が参照するオブジェクト「Monday」を参照しました。中古新品オペレータは、「新しいものが欲しいのです! 古いものではありません!」とプログラムに明確に指示します。したがって、新しい「Monday」Sting オブジェクトがメモリ内に作成されます。それらの値は同じですが、場所が異なります。1 人はプールで泳ぎ、もう 1 人は海岸で休んでいます。おっと、資源の無駄遣いですね。明らかに同じなのに、なぜ分離する必要があるのでしょうか。
4. プログラムを再度変更します。
次のようにコードをコピーします。
パブリッククラスのテスト文字列
{
publicstaticvoid main(String[] args)
{
文字列 s1="月曜日";
String s2 =new String("月曜日");
s2 = s2.intern();
if (s1 == s2)
{
System.out.println("s1 == s2");
}
それ以外
{
System.out.println("s1 != s2");
}
if (s1.equals(s2))
{
System.out.println("s1 は s2 と等しい");
}
それ以外
{
System.out.println("s1 が s2 と等しくない");
}
}
}
今回は次を追加しました: s2 = s2.intern(); プログラム出力: s1 == s2 s1 は s2 に等しい(java.lang.String の intern() メソッド "abc" であることがわかります。intern() メソッドの戻り値は依然として文字列 "abc" です。表面的には、このメソッドは役に立たないように見えます。しかし、実際、このメソッドは小さなトリックを実行します。文字列プールに文字列「abc」があるかどうかを確認し、存在しない場合はその文字列を返します。このメソッドは文字列に「abc」を追加します。プールしてから引用を返します。)