1. 程式人生 > >Java bean 下 覆蓋equals 和HashCode方法 的實現和作用

Java bean 下 覆蓋equals 和HashCode方法 的實現和作用

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));
        }
}