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();
}
}