1. 程式人生 > >"=="和equals方法有什麼區別?

"=="和equals方法有什麼區別?

equals()和“==”操作用於物件的比較,檢查倆物件的相等性,但是他們倆的主要區別在於前者是方法,後者是操作符。

總結:
1 一般使用比較原生型別如:boolean、int、char等等,使用equals()比較物件。
2 如果兩個引用指向相同的物件
返回true,equals()的返回結果依賴於具體業務實現,一般重寫equals方法時,同樣重寫hashcode方法,預設的equals方法實現是與“”操作一樣的。
3 字串的對比使用equals()代替
操作符

參考程式碼: EqualsTest

// "=="和equals測試
public class EqualsTest {
	
	public static void main(String[] args) {
		int a = 1;
		int b = 1;
		int c = 2;
		System.out.println(a == b); // true
		System.out.println(a == c); // false
		
		String s1 = new String("str"); 
		String s2 = new String("str"); 
		
		System.out.println("s1 == s2: " + (s1 == s2)); // false,比較的是記憶體地址,引用
		System.out.println("s1 equals s2: " + (s1.equals(s2))); // true
		
		// 物件的比較一般重寫equals和hashcode方法
		Student stu1 = new Student(1, "張三");
		Student stu2 = new Student(1, "張三");
		System.out.println("stu1 == stu2 : " + (stu1 == stu2)); // false
		System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2)); // true
	}
	
	static class Student {
		private int age;
		private String name;

		public Student() {
		}

		public Student(int age, String name) {
			super();
			this.age = age;
			this.name = name;
		}

		public int getAge() {
			return age;
		}

		public String getName() {
			return name;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public void setName(String name) {
			this.name = name;
		}
		
		/**
		 * 年齡和名稱都相等的時候
		 */
		@Override  
	   public boolean equals(Object obj) {  
	       if (this == obj)  
	           return true;  
	       if (obj == null)  
	           return false;  
	       if (getClass() != obj.getClass())  
	           return false;  
	       Student other = (Student) obj;  
	       if (age != other.age)  
	           return false;  
	       if (name == null) {  
	           if (other.name != null)  
	               return false;  
	       } else if (!name.equals(other.name))  
	           return false;  
	       return true;  
	   }  
		
		@Override  
	   public int hashCode() {
	       final int prime = 31;  
	       int result = 1;  
	       result = prime * result + age;  
	       result = prime * result + ((name == null) ? 0 : name.hashCode());  
	       return result;  
	   }     
	}
	
    
}

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class EqualsTest {
	public static void main(String[] args) {
		LinkedList<Student> list = new LinkedList<Student>();
		Set<Student> set = new HashSet<Student>();
		Student stu1 = new Student(1, "張三");
		Student stu2 = new Student(1, "張三");
		System.out.println("stu1 == stu2 : " + (stu1 == stu2));
		System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2));
		list.add(stu1);
		list.add(stu2);
		System.out.println("list size:" + list.size());

		System.out.println("下面的HashSet的內容=====");
		set.add(stu1);
		set.add(stu2);
		System.out.println("set size:" + set.size());
		
		// 修改學生的年齡,hashcode的值會改變
		// 當我們將某個物件存到set中時,如果該物件的屬性參與了hashcode的計算,
		// 那麼以後就不能修改該物件參與hashcode計算的那些屬性了,否則會引起意向不到的錯誤的。
		stu1.setAge(40);
		System.out.println("刪除元素stu1是否成功: " + set.remove(stu1));
		System.out.println("操作刪除元素後set size:" + set.size());
	}

}