equals 與 == 的差別

equals 與 == 的差別

轉至: http://my.so-net.net.tw/idealist/Java/Basic/equals.html

在Java裡,equals和==常令程式設計師困惑,這裡簡單說明如下 :

==

測試物件參考時,唯有當兩個參考指向同一物件時,==運算子的結果才為true,同樣的,唯有當兩個參考指向不同物件時,!=運算子的結果才為true,這兩個運算子的處理與物件的內容無關。需要特別注意的是,在String中使用==,因為Java為節省記憶體,會在某一輪調區中維護唯一的String物件,所以如果在類別裡使用同一字串,Java只會建立一個唯一的字串而已。


equals

另一種測試的做法是equals,equals在類別為Java原先就存在時,是比較兩個物件是否為相同類型的類別後再比較其內容值是否相同 (ex: Java 的內建類別, Integer …等),是就傳回true,否就傳回false。當要測試的類別是自定類別時,要依自定類別所提供的equals來決定如何比較,如果自定類別沒有覆蓋Object的equals類別的話,就以Object的equals來比較,Object的equals的比較方式如同==。

 

下面以簡單的範例程式說明 equals 與 == 的差別 :

myObject1

{
    int nNum = 100;
 
    public void setNum(int nN) 
    {
        nNum = nN;
    }
 
    public int getNum()
   {
        return nNum;
    }
 
    public void printNum() 
    {
        System.out.println(nNum);
    }
}

myObject2

{
    int nNum = 100;
 
    public void setNum(int nN) 
    {
        nNum = nN;
    }
 
    public int getNum()
    {
        return nNum;
    }
 
    public void printNum() 
    {
        System.out.println(nNum);
    }

    public boolean equals(Object obj) 
    {
        if (obj == null) return false;

        if (!(obj instanceof myObject2)) 
            return false;

        return this.nNum == ((myObject2) obj).getNum();
    }
}

myEquals

{
    public myEquals() 
    {
        //------------------字串型別------------------
        String sA = "ABC";
        String sB = "ABC";
        String sC = new String("ABC");
 
        //==的比較
        if (sA == sB)
        {
            System.out.println("sA == sB");
        }
        else
        {
            System.out.println("sA != sB");
        }
 
        if (sA == sC)
        {
            System.out.println("sA == sC");
        }
        else
        {
            System.out.println("sA != sC");
        }

        //equals的比較
        if (sA.equals(sB))
        {
            System.out.println("sA.equals(sB) = true");
        }
        else
        {
            System.out.println("sA.equals(sB) = false");
        }
 
        if (sA.equals(sC))
        {
            System.out.println("sA.equals(sC) = true");
        }
        else
        {
            System.out.println("sA.equals(sC) = false");
        }

        // 執行結果
        // sA == sB
        // sA != sC
        // sA.equals(sB) = true
        // sA.equals(sC) = true*/
        //------------------字串型別------------------

        //--------------Java原有的型別--------------
        //Java原有的型別
        Long lngA = new Long(100);
        Long lngB = new Long(100);
        Long lngC = new Long("100");
 
        //==的比較
        if (lngA == lngB)
        {
            System.out.println("lngA == lngB");
        }
        else
        {
            System.out.println("lngA != lngB");
        }
 
        if (lngA == lngC)
        {     
             System.out.println("lngA == lngC");
        }    
        else
        {
            System.out.println("lngA != lngC");
        }
 
        //equals的比較
        if (lngA.equals(lngB))
        {
            System.out.println("lngA.equals(lngB) = true");
        }
        else
        {
            System.out.println("lngA.equals(lngB) = false");
        }
 
        if (lngA.equals(lngC))
        {
            System.out.println("lngA.equals(lngC) = true");
        }
        else
        {
            System.out.println("lngA.equals(lngC) = false");
        }

        // 執行結果
        // lngA != lngB
        // lngA != lngC
        // lngA.equals(lngB) = true
        // lngA.equals(lngC) = true
        //--------------Java原有的型別--------------
 
        //------------------自定型別------------------
        myObject1 m1A = new myObject1();
        myObject1 m1B = new myObject1();
        myObject2 m2A = new myObject2();
        myObject2 m2B = new myObject2();
 
        //==的比較
        if (m1A == m1B)
       {
            System.out.println("m1A == m1B");
        }    
        else
        {
            System.out.println("m1A != m1B");
        }
 
        if (m2A == m2B)
        {
            System.out.println("m2A == m2B");
        }
        else
        {
            System.out.println("m2A != m2B");
        }
 
        //equals的比較
        if (m1A.equals(m1B))
        {
            System.out.println("m1A.equals(m1B) = true");
        }
        else
        {
            System.out.println("m1A.equals(m1B) = false");
        }
 
        if (m2A.equals(m2B))
        {
            System.out.println("m2A.equals(m2B) = true");
        }
        else
        {
            System.out.println("m2A.equals(m2B) = false");
        }

        // 執行結果
        // m1A != m1B
        // m2A != m2B
        // m1A.equals(m1B) = false
        // m2A.equals(m2B) = true
        //------------------自定型別------------------
    }

    public static void main(String[] args) 
    {
        myEquals myEquals1 = new myEquals();
    }
}