JAVAにおける「==」と「equals()」の理解

4662 ワード

JAvaのデータ型は、2種類に分けられます:1.元のデータ型とも呼ばれる基本データ型.byte,short,char,int,long,float,double,booleanの比較2等号(==)を適用し、値を比較します.2.複合データ型(クラス)を使用する場合(==)比較を行う場合、比較はメモリに格納されているアドレスであるため、同一のnewが出てくるオブジェクトでない限り、比較後の結果はtrueとなり、比較後の結果はfalseとなる.JAVAではすべてのクラスがObjectというベースクラスに継承されており、Objectではベースクラスにequalsのメソッドが定義されており、このメソッドの初期動作はオブジェクトのメモリアドレスを比較するが,String,Integer,Dateのようなクラスライブラリではequals自身の実装があり,比較クラスのスタックメモリにおける格納アドレスではない.複合データ型間でequals比較を行う場合、equalsメソッドを上書きしない場合、Objectのequalsメソッドも2等号(==)で比較されるため、比較後の結果は2等号(=)の結果と同じである.

1 public class TestString {
2  public static void main(String[] args) {
3 String s1 = "Monday";
4 String s2 = "Monday";
5 if (s1 == s2)
 6
{
7 System.out.println("s1 == s2");}
8 else{
9 System.out.println("s1 != s2");}
10 }
11 }


プログラムをコンパイルして実行し、出力:s 1==s 2説明:s 1とs 2は同じStringオブジェクト--「Monday」を参照します!2.もう少しプログラムを変更すると、もっと奇妙な発見があります.

public class TestString {
public static void main(String[] args) {
String s1
= "Monday";
String s2
= new String("Monday");
if (s1 == s2)
{System.out.println(
"s1 == s2");}
else
{System.out.println(
"s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println(
"s1 not equals s2");}
}
}


s 2をnewオペレータでプログラム出力を作成します:s 1!=s 2 s 1 equals s 2の説明:s 1 s 2はそれぞれ2つの「Monday」Stringオブジェクトを参照する.文字列バッファは元々、プログラムが実行されている間に文字列バッファが作成されていました.s 2=「Monday」という表現を使用して文字列が作成されている場合、プログラムはまずこのStringバッファで同じ値のオブジェクトを探します.最初のプログラムでは、s 1が先にプールに配置されているので、s 2が作成されたとき、プログラムは同じ値を持つs 1を見つけてs 2をs 1に引用したオブジェクト「Monday」の2段目のプログラムでnewオペレータを使って、彼ははっきりとプログラムに「新しいものがほしい!古いものは要らない!」と言った.新しいMonday Stingオブジェクトがメモリに作成されます.彼らの値は同じですが、位置が異なり、池で泳いで岸辺で休んでいます.いや、資源の浪費だ.同じなのに分けて何をしなければならないのか.4.プログラムの再変更:

public class TestString {
public static void main(String[] args) {
String s1
= "Monday";
String s2
= new String("Monday");
s2
= s2.intern();
if (s1 == s2)
{System.out.println(
"s1 == s2");}
else
{System.out.println(
"s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println(
"s1 not equals s2");}
}
}


今回加入:s 2=s 2.intern();プログラム出力:s 1==s 2 s 1 equals s 2元、(java.lang.Stringのintern()メソッド「abc」.intern()メソッドの戻り値は文字列「abc」で、表面的にはこのメソッドは役に立たないように見えます.しかし、実際には、文字列プールにabcという文字列が存在するかどうかをチェックし、存在する場合はプールの文字列を返します.存在しない場合、このメソッドは「abc」を文字列プールに追加し、参照を返します.)