(詳解見:http://blog.csdn.net/uponz/article/details/79117786)
1. “==”
基本數據類型,根據基本數據類型的值判斷是否相等,相等返回true,反之返回false
引用數據類型,比較的是引用類型的地址值
//基本數據類型
//兩端數據類型可以不同,在不同情況下也可以返回true
int a = 23;
int b = 24;
char c = 23;
float d = 23.0F;
System.out.println(a==b);//false
System.out.println(a==c);//true
System.out.println(a==d);//true
char m = 'A';
int n = 65;
System.out.println(m==n);//true
//引用數據類型
//比較的是引用類型的地址值是否相等
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = obj1;
System.out.println(obj1);//java.lang.Object@70dea4e
System.out.println(obj2);//java.lang.Object@5c647e05
System.out.println(obj3);//java.lang.Object@70dea4e
System.out.println(obj1 == obj2);//false
System.out.println(obj1 == obj3);//true
2. equlas()
只能處理引用數據類型
在Object中發現equlas()比較的仍然是引用變量的地址值
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));//false
System.out.println(o1 == o2);//false
String str1 = "as";
String str2 = "as";
String str3 = new String("as");
System.out.println(str1 == str2);//true-->比較的是常量池中"as"的地址值
System.out.println(str1.equals(str2));//true-->比較的是常量池中"as"的地址值
System.out.println(str1 == (str3));//false-->比較的是常量池中"as"的地址值和堆內存中new出來的對象賦給str3的地址值
System.out.println(str1.equals(str3));//true-->String類重寫了父類Object的equlas(),故比較的是內容:"as"
String s1 = new String("as");
String s2 = new String("as");
System.out.println(s1 == s2);//false-->比較的是地址值
System.out.println(s1.equals(s2));//true-->String類重寫了父類Object的equlas(),故比較的是實體內容是否完全相同
【特別注意】
Object類中的equals方法和“==”是一樣的,沒有區別,而String類,Integer類等等一些類,是重寫了equals方法,才使得equals和“==不同”,所以,當自己創建類時,自動繼承了Object的equals方法,要想實現不同的等於比較,必須重寫equals方法。
“==”比”equal”運行速度快,因爲”==”只是比較引用.
最後有一個很重要小細節,最好寫
“”.equals(str);而不是str.equals(“”);
因爲str可能爲空,這容易出錯,所以最好將需要被比較的常量寫在前面。