1. 程式人生 > 其它 >|NO.Z.00004|——————————|BigDataEnd|——|Java&核心類庫.V04|----------------------------------------------|Java.v04|equals方法|重寫實現|equals方法和hashCode方法生成|

|NO.Z.00004|——————————|BigDataEnd|——|Java&核心類庫.V04|----------------------------------------------|Java.v04|equals方法|重寫實現|equals方法和hashCode方法生成|



[BigDataJava:Java&核心類庫.V04]                                                                             [BigDataJava.核心類庫] [|章節一|Java核心類庫|equals方法的重寫實現|equals方法的重寫|equals方法和hashCode方法的生成|]








一、[equals方法的重寫實現]equals方法的重寫equals方法和hashCode方法的生成]:equals方法的重寫實現
package com.yanqi.task11;

import java.util.Objects;

public class Student extends Object {
    private int id; // 用於描述學號的成員變數
    private String name; // 用於描述姓名的成員變數

    public Student() {
    }

    public Student(int id, String name) {
        setId(id);
        setName(name);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        if (id > 0) {
            this.id = id;
        } else {
            System.out.println("學號不合理哦!!!");
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
/*
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (id != student.id) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }

 */
    /**
     * 為了比較兩個物件的內容,也就是學號資訊需要重寫該方法
     */
    // Student this = s1;
    // Object obj = s2;
    /*
    @Override
    public boolean equals(Object obj) {
        // 當呼叫物件和引數物件指向同一個物件時,則內容一定相同
        if (this == obj) return true;
        // 當呼叫物件為不為空而引數物件為空時,則內容一定不相同
        if (null == obj) return false;
        // 判斷obj指向的物件是否為Student型別的物件,若是則條件成立,否則條件不成立
        if (obj instanceof Student) {
            Student ts = (Student) obj;
            // 以學號作為基準判斷兩個物件是否相等  int是基本資料型別,記憶體空間中放的就是資料本身,使用 == 可以判斷資料是否相同
            //return this.getId() == ts.getId();
            // 以姓名作為基準判斷兩個物件是否相等  String是引用資料型別,記憶體空間中放的是地址,使用 == 判斷地址是否相同
            // 也就是判斷兩個物件中姓名字串的地址是否相同,不夠完美
            //return this.getName() == ts.getName();
            return this.getName().equals(ts.getName()); // 比較姓名字串的內容是否相同
        }
        // 否則型別不一致沒有可比性,則內容一定不相同
        return false;
    }
    */
    /**
     * 為了使得該方法的結果與equals方法的結果保持一致,從而滿足Java官方的常規協定,需要重寫該方法
     */
    /*
    @Override
    public int hashCode() {
        //return getId(); // 不再代表記憶體地址的編號了
        final int type = 12;
        //return type*31 + getId();
        return type*31 + getName().hashCode();
    }
    */
    /**
     * 為了返回更有意義的字串資料,則需要重寫該方法
     */
    /*
    @Override
    public String toString() {
        return "Student[id = " + getId() + ", name = " + getName() + "]";
    }
     */
}
二、程式設計程式碼
package com.yanqi.task11;

public class StudentTest {

    public static void main(String[] args) {

        // 1.使用有參方式構造Student型別的兩個物件並判斷是否相等
        Student s1 = new Student(1001, "zhangfei");
        //Student s2 = new Student(1002, "guanyu");
        Student s2 = new Student(1001, "zhangfei");
        //Student s2 = s1;  // 表示s2和s1都指向了同一個物件,地址相同了
        // 下面呼叫從Object類中繼承下來的equals方法,該方法預設比較兩個物件的地址,可以檢視原始碼驗證
        // 當Student類中重寫equals方法後,則呼叫重寫以後的版本,比較內容
        //boolean b1 = s1.equals(s2);
        //Student s3 = null;
        //boolean b1 = s1.equals(s3);
        //Student s3 = s1;
        boolean b1 = s1.equals(s2);
        System.out.println("b1 = " + b1); // false true
        System.out.println(s1 == s2); // 比較地址  false

        System.out.println("----------------------------------------------------------");
        // 下面呼叫從Object類中繼承下來的hashCode方法,獲取呼叫物件的雜湊碼值(記憶體地址的編號)
        // 當Student類中重寫hashCode方法後,則呼叫重寫以後的版本
        int ia = s1.hashCode();
        int ib = s2.hashCode();
        System.out.println("ia = " + ia);
        System.out.println("ib = " + ib);

        System.out.println("----------------------------------------------------------");
        // 下面呼叫從Object類中繼承下來的toString方法,獲取呼叫物件的字串形式:包名.類名@雜湊碼值的十六進位制
        // 當Student類中重寫toString方法後,則呼叫重寫以後的版本:Student[id = 1001, name = zhangfei]
        String str1 = s1.toString();
        System.out.println("str1 = " + str1); // com.yanqi.task11.Student@55d
        System.out.println(s1); // 當列印一個引用變數時會自動呼叫toString方法
        String str2 = "hello" + s1;
        System.out.println("str2 = " + str2);
    }
}
三、編譯列印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=49684:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task11.StudentTest
b1 = true
false
----------------------------------------------------------
ia = -1432584938
ib = -1432584938
----------------------------------------------------------
str1 = Student{id=1001, name='zhangfei'}
Student{id=1001, name='zhangfei'}
str2 = helloStudent{id=1001, name='zhangfei'}

Process finished with exit code 0








===============================END===============================


Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart                                                                                                                                                    ——W.S.Landor



來自為知筆記(Wiz)