1. 程式人生 > >Java中兩個物件的比較 equals()方法和==號的區別

Java中兩個物件的比較 equals()方法和==號的區別

在Java中,時不時我們會把兩個物件進行,然而得到的結果卻不是我們想的結果,這是怎麼回事呢?

一、兩種形式的比較:比較時,我們要弄清楚是哪一種比較。   

 1.值型別比較     

即內容相同,我們就認為是相等的。比如:int i=5;int j =5;此時我們說i和j相等,其實指的是i和j的內容相同。  

2.引用型別比較    

但在Java中,除了值型別,另外還有一種引用型別,而不同的物件,其引用值其實並不相等,即在記憶體中的不同的地 址單元中。比如我們定義了學生類,分別有兩個學生物件例項 :   

      Student stu= new Student();   Student stu1= new Student();

 此時我們無論是使用stu==stu1符號,或者stu.equals(stu1)方法,把兩個物件進行比較,得到的結果都是不相等的,因為對於引用型別來說,預設是比較兩個物件引用的地址,顯示,每個物件的引用有自己唯一的地址,所以,是不相等。


二、有時,我們比較兩個物件時,如果他們的內容一樣,那麼我們就認為這兩個物件是相等的,如上面的兩個學生物件。這時,我們該怎麼辦呢?其實,非常簡單,只要在類裡面重寫equals()方法,進行物件裡面的內容比較久可以了。如上面,我們只需要在Student類中重寫equals()方法即可。    

下面,讓我們來看看例項吧!     沒有重寫equals()方法時的比較:

學生類:Student類

package com.bluesky;

public class Student {
	
	String name;
	
	public Student(){
		
	}
	
	public Student(String name){
		
		this.name=name;
		
	}</strong>
	

}</span>

測試類Test:

package com.bluesky;

public class Test {

	public static void main(String[] args) {

      int i=5;
      int j=5;
      
      if(i==j) System.out.println("i和j相等!");
      else System.out.println("不相等!");
      
      Student s = new Student("BlueSky");
      Student s1=new Student("BlueSky");
      
      if(s==s1)  System.out.println("s和是s1相等!");
      else System.out.println("s和是s1不相等!");
      
      if(s.equals(s1)) System.out.println("s和是s1相等!");
      else System.out.println("s和是s1不相等!");
	}
}

執行結果:

重寫equals()方法後再次進行比較:

 Student類:

package com.bluesky;

public class Student {
	
	String name;
	
	public Student(){
		
	}
	
	public Student(String name){
		
		this.name=name;
		
	}

	
	public boolean equals(Object obj) {
		if (this == obj)      //傳入的物件就是它自己,如s.equals(s);肯定是相等的;
			return true; 
		if (obj == null)     //如果傳入的物件是空,肯定不相等
			return false;
		if (getClass() != obj.getClass())  //如果不是同一個型別的,如Studnet類和Animal類,
			                               //也不用比較了,肯定是不相等的
			return false;
		Student other = (Student) obj;     
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))   //如果name屬性相等,則相等
			return false;
		return true;
	}
	

}

測試類Test:
package com.bluesky;

public class Test {

	public static void main(String[] args) {

      int i=5;
      int j=5;
      
      if(i==j) System.out.println("i和j相等!");
      else System.out.println("不相等!");
      
      Student s = new Student("BlueSky");
      Student s1=new Student("BlueSky");
      
      if(s==s1)  System.out.println("s和是s1相等!");
      else System.out.println("s和是s1不相等!");
      
      if(s.equals(s1)) System.out.println("s和是s1相等!");
      else System.out.println("s和是s1不相等!");
	}
}
執行結果:

重寫equals()方法後,得到s和s1相等。==對引用型別的只能進行地址比較,故還是不相等的。