==與equals方法的區(qū)別
==操作符專門用來比較兩個(gè)變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲(chǔ)的數(shù)值是否相同,要比較兩個(gè)基本類型的數(shù)據(jù)或兩個(gè)引用變量的引用地址是否相等,只能用==操作符。
如果一個(gè)變量指向的數(shù)據(jù)是對象類型的,那么,這時(shí)候涉及了兩塊內(nèi)存,對象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如Objet obj = new Object();變量obj是一個(gè)內(nèi)存,new Object()是另一個(gè)內(nèi)存,此時(shí),變量obj所對應(yīng)的內(nèi)存中存儲(chǔ)的數(shù)值就是對象占用的那塊內(nèi)存的首地址。對于指向?qū)ο箢愋偷淖兞?,如果要比較兩個(gè)變量是否指向同一個(gè)對象,即要看這兩個(gè)變量所對應(yīng)的內(nèi)存中的數(shù)值是否相等,這時(shí)候就需要用==操作符進(jìn)行比較。
equals方法是用于比較兩個(gè)獨(dú)立對象的內(nèi)容是否相同,就好比去比較兩個(gè)人的長相是否相同,它比較的兩個(gè)對象是獨(dú)立的。例如,對于下面的代碼:
String a=new String(“foo”);
String b=new String(“foo”);
兩條new語句創(chuàng)建了兩個(gè)對象,然后用a,b這兩個(gè)變量分別指向了其中一個(gè)對象,這是兩個(gè)不同的對象,它們的首地址是不同的,即a和b中存儲(chǔ)的數(shù)值是不相同的,所以,表達(dá)式a==b將返回false,而這兩個(gè)對象中的內(nèi)容是相同的,所以,表達(dá)式a.equals(b)將返回true。
在實(shí)際開發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來的字符串內(nèi)容是否等,例如,String input = …;input.equals(“quit”),記住,字符串的比較基本上都是使用equals方法。
package logTest;
/**
* @Type EqualTest.java
* @Desc 用來比較==與equal
* @author xiang
* @date 2017年3月11日 下午3:22:49
* @version
*/
public class EqualTest {
/* 對于Integer var=?在-128至127之間的賦值,Integer對象是在IntegerCache.cache產(chǎn)生,會(huì)復(fù)用已有對象,
這個(gè)區(qū)間內(nèi)的Integer值可以直接使用==進(jìn)行判斷,
但是這個(gè)區(qū)間之外的所有數(shù)據(jù),都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對象,*/
public static void main(String[] args) {
byte aByte=100;
byte bByte=100;
int a=100;
int b=100;
Integer a1=-1;
Integer b1=-1;
Integer a2=-129;
Integer b2=-129;
String aStr=new String("foo");
String bStr=new String("foo");
System.out.println("aByte=bByte:"+(aByte==bByte));
System.out.println("a=b:"+(a==b));
System.out.println("a1=b1:"+(a1==b1));
System.out.println("a1.equals(b1):"+(a1.equals(b1)));
System.out.println("a2=b2:"+(a2==b2));
System.out.println("a2.equals(b2):"+(a2.equals(b2)));
System.out.println("aStr=bStr:"+(aStr==bStr));
System.out.println("aStr.equals(bStr):"+(aStr.equals(bStr)));
}
}
作者:碼農(nóng)飛哥
微信公眾號(hào):碼農(nóng)飛哥