毎日JAVAの簡単な教育:簡単なデータ型、住所の比較と値の比較

3908 ワード

昨日ブラウン演算と言いましたが、今日はその中の==演算子とObjectのequalsメソッドを詳しく説明します.
まず、これらを話す前に、JAVAのデータ型について補足して説明します.JAVAには2種類のデータ型があり、1つ目はprimitive(単純データ型)と、もう1つはObjectです.
単純なデータ型の特徴は次のとおりです.
1)クラス名はキーワード
2)パッケージ名がなく、アクセス方法がなく、Objectのサブクラスではない
このようなデータはよく使われるデータであり、スペースを節約するためにObjectを継承せず、クラスが多い方法を除去し、メモリスペースを節約していることがわかります.
一般的な単純なデータ型は次のとおりです.
int,long,short,double,float,byte,char,boolean,void
保存可能な数値範囲についてはネットで検索できます
特に、voidは関数の戻りタイプを定義するのに適しており、演算には使用できません.
なぜ単純なタイプの演算に言及するのでしょうか.==演算子とequalsメソッドを説明するため、それらに関連します.
まず、次のコードを見てみましょう.

package operator;

public class EqualComparation
{
    public static void main(String[] args)
    {
        int a=1;
        int b=1;
        System.out.println(a == b);
    }
}

皆さんはすぐに答えられると信じています.
次に、JDK 1.5の新しい特性を見てみましょう.単純なデータ型とオブジェクト型のデータの比較です.

package operator;

public class EqualComparation
{
    public static void main(String[] args)
    {
        Integer a=1;
        int b=1;
        System.out.println(a == b);
    }
}

上の結果もtrueですよ.jdk 1.5は基礎データ型を対応するオブジェクトに変換してから値比較を行うしかないからです.
この改善をよりよく理解するために、1.4時代に上記のコードがどのように実現されるかを示します.

package operator;

public class EqualComparationForJDK14
{
    public static void main(String[] args)
    {
        Integer a= Integer.valueOf(1);
        int b=1;
        System.out.println(a.equals(Integer.valueOf(b)));
    }
}

単純タイプは、以前は必ずオブジェクトに変換してからオブジェクトと比較することができますよ.もちろん、オブジェクトを単純タイプに変換するほうが安全です.
どうして?以下のオブジェクト間の比較では==とequalsメソッドが異なることが多いからです.
equalsメソッドは、2つのオブジェクト間を比較するためのObjectのpublicメソッドです.
値の異同.では、==と比較して何が違いますか?==オブジェクト間の比較に使用される場合、Cの===と同様に、2つのオブジェクトを比較します.
hashCode.このhashCodeは、各オブジェクトの一意性を保証するために、格納オブジェクトのアドレスビットから得られる.ObjectではhashCode()を使用して、現在のインスタンスのhashCodeコードを表示できます.
Object.equals(Object)コードを見てみましょう.

    public boolean equals(Object obj) {
	return (this == obj);
    }

次に、この方法が2つのオブジェクトのhashCodeを比較して返される値であることを説明します.理論的には、newから出てくるObjectごとにhashCodeが異なります.

package object;

public class HashCodeDemo
{
    public static void main(String[] args)
    {
        Object a = new Object();
        Object b = new Object();
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
    }
}

この例では、2つのhashCodeが異なることがわかります.
したがって、オブジェクト値の比較については、equalsメソッドを呼び出すことをお勧めします.また、クラスが比較演算に関連している場合は、このメソッドを書き直して、比較論理を実現したほうがいいです.
最後にInteger.equals(Object)メソッドを見てみましょう

     public boolean equals(Object obj) {
	if (obj instanceof Integer) {
	    return value == ((Integer)obj).intValue();
	}
	return false;
    }

したがって、==で2つのIntegerクラスを直接比較すると、実際には2つのインスタンスのhashCodeを比較し、Integerクラス自体のhashCodeではなく、Object親のhashCodeを呼び出します.次の両端コードを参照してください.
まずはIntegerのhashCodeメソッド

    public int hashCode() {
	return value;
    }

このvalueはIntegerが保存したint値であり、理論的には以下のコードにtrueを表示します.

    Integer a =1;
    System.out.println(a.hashCode());
    System.out.println(new Integer(1).hashCode());
    System.out.println(a == new Integer(1));

しかし実際には、実際の最後の結果はfalseであることが分かった.また、a.hashCode()とnew Integer(1).hashCode()の両方が1であることは、1行目と2行目に表示される内容から分かる.
次の点がわかりました
1)==単純なデータ型間の比較
2)==2つのオブジェクトが同じインスタンスかどうかを比較する場合
3).equalsメソッドは、2つのオブジェクトの値を比較するために使用され、実際の必要に応じて特定のオブジェクトのequals()メソッドを書き換えて、同類のオブジェクト間の特定の比較ロジックを実現することができます.
今日はここまでで、明日はタイプが逆転します.