Java bean 下 覆蓋equals 和HashCode方法 的實現和作用
阿新 • • 發佈:2019-02-17
1.原理
有時候使用集合的時候我們希望集合裡面的物件要是不一樣的,但是每個物件都進行new 操作例項物件,我們在使用物件的引用去equals比較都是為false,即會導致這兩個物件引用變數一直不同,但是物件的屬性可以相同如物件的引用變數s1.equals(s2) = false;但是物件的屬性值相同,所以重寫equals方法是達到去在使用equals的時候比較物件裡面的屬性值是否相同
Student s1 = new Student("zhangsna",30);
Student s2 = new Student("zhangsna",0);
這裡重寫了Student類的equals 和HashCode方法,達到使用equals比較的不是棧區的引用變數的地址比較,
而是堆區物件的內部屬性的比較
即使用equals只有在Student物件中那麼name和age相同的情況下才為true
2. 好處,在做資料的持久化操作的時候省去在判斷zhangsna是否已經存在了資料庫
3. 程式碼
public class Student{ private String name; private int age; public Student(){} public Student(String name,int age){ this.name = name; this.age = age; } public int hashCode(){ return name.hashCode()+age; } public boolean equals(Object obj){ System.out.println(obj+"..equals方法執行.."+this); if(this==obj) return true; //這個在父類Object 裡的hashCode就已經比較過 ,可以省去 if(this.getClass()!=obj.getClass()) return false; Student stu = (Student)obj; return name.equals(stu.name)&&(age==stu.age); } public String toString(){ return name+","+age; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } }
/** * @author gress * 這裡重寫了Student類的equals 和HashCode方法,達到使用equals比較的不是棧區的引用變數的地址比較, * 而是堆區物件的內部屬性的比較 * 即使用equals只有在Student物件中那麼name和age相同的情況下才為true */ public class Test { public static void main(String[] args) { Student student = new Student(2, "name"); Student student1 = new Student(3, "name"); Student student2 = new Student(2, "name"); System.out.println(student==student1); System.out.println(student.equals(student1)); System.out.println(student.equals(student2)); } }