|NO.Z.00004|——————————|BigDataEnd|——|Java&核心類庫.V04|----------------------------------------------|Java.v04|equals方法|重寫實現|equals方法和hashCode方法生成|
阿新 • • 發佈:2022-04-03
[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)