1.java中equals方法和"= ="的區別:
equals 方法是 java.lang.Object 類的方法。
有兩種用法說明:
(1)對於字符串變量來說,使用“==”和“equals()”方法比較字符串時,其比較方法不同。
“==”比較兩個變量本身的值,即兩個對象在內存中的首地址。
“equals()”比較字符串中所包含的內容是否相同。
(2)對於非字符串變量來說,"=="和"equals"方法的作用是相同的都是用來比較其
對象在堆內存的首地址,即用來比較兩個引用變量是否指向同一個對象。
== 比較符也是比較指向的對象是否相同的也就是對象在對內存中的的首地址。一個類對象的地址就是類所包含的這一片內存空間的首地址,這個首地址也就對應具體某一個成員變量的地址。
Object類中的equals方法是用來比較“地址”的
而JDK類中有一些類覆蓋了oject類的equals()方法,比較規則為:如果兩個對象的類型一致,並且內容一致,則返回true,這些類有:
java.io.file,java.util.Date,java.lang.string,包裝類(Integer,Double等)
比如
Integer int1=new Integer(1);
Integer int2=new Integer(1);
String str1=new String("hello");
String str2=new String("hello");
int1==int2 輸出:false,因為不同對象
int1.equals(int2) 輸出:TRUE
str1==str2 (false)
str1.equals(str2) (true)
當然,可以自定義覆蓋object類的equals()方法,重新定義比較規則。
如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
結果: s1.equals(s2) //是false
解釋:StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自Object類,
而Object類中的equals方法是用來比較“地址”的,所以等於false.
比如,下面Person類的equals()比較規則為:只要兩個對象都是Person類,並且他們的屬性name都相同,則比較結果為true,否
則返回false
public class Person{
private String name;
public Person(String name)
{
this.name=name;
}
public boolean equals(Object o)
{
if (this==0) return true;
if (!o instanceof Person) return false;
final Person other=(Person)o;
if (this.name().equals(other.name()))
return true;
else
return false;
}
}
注意,在重寫equals方法時,要注意滿足離散數學上的特性
1、自反性 :對任意引用值X,x.equals(x)的返回值一定為true.
2 對稱性: 對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;
3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4 一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false