首先,來(lái)看看它們的區(qū)別:
(推薦學(xué)習(xí):java入門(mén)程序)
-
equals()方法用來(lái)比較的是兩個(gè)對(duì)象的內(nèi)容是否相等,由于所有的類(lèi)都是繼承自java.lang.Object類(lèi)的,所以適用于所有對(duì)象,如果沒(méi)有對(duì)該方法進(jìn)行覆蓋的話,調(diào)用的仍然是Object類(lèi)中的方法,而Object中的equals方法返回的卻是==的判斷;
-
"==" 比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址,用來(lái)判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一個(gè)對(duì)象。
equals()作用
equals() 的作用是用來(lái)判斷兩個(gè)對(duì)象是否相等。
equals() 定義在JDK的Object.java中。通過(guò)判斷兩個(gè)對(duì)象的地址是否相等(即,是否是同一個(gè)對(duì)象)來(lái)區(qū)分它們是否相等。源碼如下:
public boolean equals(Object obj) { return (this == obj); }
既然Object.java中定義了equals()方法,這就意味著所有的Java類(lèi)都實(shí)現(xiàn)了equals()方法,所有的類(lèi)都可以通過(guò)equals()去比較兩個(gè)對(duì)象是否相等。
但是,我們已經(jīng)說(shuō)過(guò),使用默認(rèn)的“equals()”方法,等價(jià)于“==”方法。因此,我們通常會(huì)重寫(xiě)equals()方法:若兩個(gè)對(duì)象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。
下面根據(jù)"類(lèi)是否覆蓋equals()方法",將它分為2類(lèi)。
-
若某個(gè)類(lèi)沒(méi)有覆蓋equals()方法,當(dāng)它通過(guò)equals()比較兩個(gè)對(duì)象時(shí),實(shí)際上是比較兩個(gè)對(duì)象是不是同一個(gè)對(duì)象。這時(shí),等價(jià)于通過(guò)“==”去比較這兩個(gè)對(duì)象。
-
我們可以覆蓋類(lèi)的equals()方法,來(lái)讓equals()通過(guò)其它方式比較兩個(gè)對(duì)象是否相等。通常的做法是:若兩個(gè)對(duì)象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。
下面,舉例對(duì)上面的兩種情況進(jìn)行說(shuō)明:
1、沒(méi)有覆蓋equals()方法的情況
public class EqualsTest { public static void main(String[] args) { // 新建2個(gè)相同內(nèi)容的Person對(duì)象, // 再用equals比較它們是否相等 User user1 = new User("James", 100); User user2 = new User("James", 100); System.out.printf("比較結(jié)果:" + user1.equals(user2)); } /** * @desc User類(lèi)。 */ static class User { int age; String name; public User(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " - " + age; } } }
運(yùn)行結(jié)果:
false
結(jié)果分析:
我們通過(guò) user1.equals(user2) 來(lái)“比較user1和user2是否相等時(shí)”,實(shí)際上,調(diào)用的Object.java的equals()方法,即調(diào)用的 (user1==user2) 。
它是比較“p1和p2是否是同一個(gè)對(duì)象”。而由 user1 和 user2 的定義可知,它們雖然內(nèi)容相同;但它們是兩個(gè)不同的對(duì)象,因此,返回結(jié)果是false。
(視頻教程推薦:java視頻教程)
2、覆蓋equals()方法的情況
修改上面的EqualsTest,覆蓋equals()方法:
public class EqualsTest { public static void main(String[] args) { // 新建2個(gè)相同內(nèi)容的Person對(duì)象, // 再用equals比較它們是否相等 User user1 = new User("James", 100); User user2 = new User("James", 100); System.out.printf("比較結(jié)果:" + user1.equals(user2)); } /** * @desc User類(lèi)。 */ static class User { int age; String name; public User(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " - " + age; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) 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; } } }
運(yùn)行結(jié)果:
true
結(jié)果分析:我們?cè)贓qualsTest.java 中重寫(xiě)了User的equals()函數(shù):當(dāng)兩個(gè)User對(duì)象的 name 和 age 都相等,則返回true。因此,運(yùn)行結(jié)果返回true。
== 的作用
“==”:它的作用是判斷兩個(gè)對(duì)象的地址是不是相等。即判斷引用對(duì)象是不是指向的堆中的同一個(gè)對(duì)象,我們知道,凡是new出來(lái)的對(duì)象都在堆中。而對(duì)象的引用都存放在棧中,具體來(lái)講就是放在棧幀中,我們來(lái)看下面一段代碼:
public static void main(String[] args) { User user1 = new User("James", 100); User user2 = new User("James", 100); System.out.println("user1.equals(user2):" + user1.equals(user2)); System.out.println("user1==user2:" + (user1==user2)); }
輸出結(jié)果:
user1.equals(user2):true user1==user2:false
指向的是堆中兩塊不同的區(qū)域,所以用 "==" 比較時(shí)返回的是false。