JAVA学習(objectクラスおよびtoString,hashCode,equals)


原文を調べる
objectクラスの紹介
JAva.lang.Object(java.langパッケージは使用時にインポートを表示する必要がなく、コンパイル時にコンパイラによって自動的にインポートされます.)
Objectクラスはクラス階層のルートであり、Java内のすべてのクラスはこのクラス(すべてのクラスの親)から根本的に継承されます.
ObjectクラスはJavaで唯一親がいないクラスです.
配列などの標準コンテナクラスを含む他のすべてのクラスは、Objectクラスのメソッドを継承します.
パッケージの方法を書いて、どのタイプの値が入ってくるか分からない場合は、Objectを一般クラスとして使用できます.
objectクラスでのメソッド
各クラスはobjectクラスを直接または間接的に継承するため、objectクラスのメソッド[一般的に:toString(),hashCode(),equals()を書き換えて、対応する操作を実現するのが一般的です.次に例を用いて具体的に実現する.
リストの内容
1.String toString()
System.out.println()を呼び出すと、オブジェクトを参照するtoString()メソッドが自動的に呼び出され、各クラスが直接または間接的にObjectから継承されるため、各クラスにtoString()メソッドがあるため、参照が指すオブジェクトを参照するtoString()メソッドの戻り値が印刷されます.
従来の方法内容
public String toString(){
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public String toString(){
    return  this.getName();
}public String toString(){
    return  this.getName();
}

2.boolean equals(Object obj)
Objectクラスのequals()メソッドでは、equals()メソッドを呼び出す参照が転送された参照と一致するかどうか、すなわち、この2つの参照が同じオブジェクトを指しているかどうかを判断します.
Objectクラスのequals()メソッドは次のとおりです. 
public boolean equals(Object obj){
    return (this == obj);
}

すなわち,Objectクラスにおけるequals()メソッドは==に等しい.
継承クラスがequals()メソッドを継承Objectのクラス上書き(override)した後に,equals()メソッドを用いて2つのオブジェクトが等しいかどうかを比較することを実現した場合にのみ,equals()メソッドは==と異なるといえる.
equals()メソッドには、次のような特徴が必要です.
自己反転(reflexive):空でない参照x、x.equals(x)はtrueに戻ります.
対称性(symmetric):任意の非空参照xおよびy,x.equals(y)はtrueを返し、y.equals(x)のみがtrueを返す.
伝達性(transitive):xおよびyを空でない参照であれば、x.equals(y)がtrueを返し、y.equals(z)がtrueを返すと、x.equals(z)がtrueを返します.
コンシステンシ(consistent):2つの非空参照xとy,x.equals(y)の複数回の呼び出しは、一致した結果を維持する必要があります(複数回の比較の間にxとyの比較に関する情報が変更されていないことが前提です).
約定:x.equals(null)は、空でない参照xに対してfalseとして返されます.
またequals()メソッドを上書きする場合はhashCode()メソッドを同時に上書きすべきであり,逆も同様である.equalメソッドとtoStringメソッドを適用した単純なクラス-->
public class People {

    private String name;

//      
    public People(String name) {
        this.name = name;
    }
//  get set   
    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }   
//    toString  
    @Override
    public String toString() {
        return this.getName();
    }
//    equal  
    @Override
    public boolean equals(Object obj) {
        String name=((People)obj).getName();
        System.out.println(name);
        return this.name==name;
    }

    public static void main(String[] args) {
        People p1=new People("  ");
        People p2=new People("  ");
        People p3=new People("  ");
        System.out.println(p3);
        System.out.println("p1.equals(p2):"+p1.equals(p2));
        System.out.println("p1.equals(p3):"+p1.equals(p3));
    }
}

出力結果:
  
  
p1.equals(p2):true
  
p1.equals(p3):false

3.hashCode()
hashCodeメソッドが実際に返すのは,オブジェクトの格納アドレスである. 
public class ArrayTest {

    public static void main(String[] args){

         String a = new String("aw");
        String b = new String("aw");
        String c= "aa";
        String d= "aa";
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(c.hashCode());
        System.out.println(d.hashCode());
        System.out.println(a==b);//false
        System.out.println(c==d);//true
    }
}
3126
3126
3104
3104
false
true

このことから,hashCode値が必ずしも異なるとは限らない2つのオブジェクトが異なることが分かる.
結論:1、2つのオブジェクトが同じであれば、hashCodeの値は必ず同じである.2、2つのオブジェクトのhashCodeが同じ場合、それらは必ずしも同じではありません.3.2つのオブジェクトが異なる場合、hashCodeの値は必ずしも同じではありません.
4.2つのオブジェクトのhashCode値が異なり、2つの異なるオブジェクトに違いありません. 
参考資料:https://blog.csdn.net/sinat_34814635/article/details/79056151