==與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)飛哥