Java中整型數值==和equals的處理
前言:
equals 比較內容, == 比較地址。
PS.
equals在Object類中,作用和==完全是一樣的,都是對物件地址的比較,不是比較值。
在String類中,equals被重寫成了字串的具體值的比較,而不再是地址比較。
==:
1)基本型別之間互相比較:值進行比較。
比如:
return 5==6;
返回false
PS.
byte n1 = 5;
short n2 = 129;
return n1 == n2;
返回false,n1會隱式轉為short,低階向高階是隱式型別轉換,高階向低階必須強制型別轉換,byte<short<int<long<float<double
2)一邊是基本型別,一邊是包裝型別:
同類型的進行比較,如Integer 與int,Long與long進行==比較時,會自動拆箱。
比如:
int a = 220;
Integer b = 220;
System.out.println(a==b);//true
不同型別之間進行比較,如果有一方為非包裝類,則會自動拆箱,且會進行自動向上轉型。
比如:
int a = 220;
Short b = 220;
System.out.println(a==b);//true
3)兩邊都是包裝型別:
如果兩邊是同類型的包裝類,比較地址。
如果兩個都是new出來的物件,直接為false,如果是常量賦值,會引用存在的快取物件,關於包裝型別的;如果兩快取機制,請自行了解;
如果為不同包裝類,則不會拆箱,且不能比較,編譯會報錯。
equals():
先比較型別,再比較值
equals可以用來比較字串以及引用型別是否相等;但無法比較值型別,如整形int,double
1)基本型別之間互相比較:無法比較。
2)一邊是基本型別,一邊是包裝型別:
同類型的進行比較,如Integer 與int,Long與long進行比較時,先會進行自動裝箱,基本型轉換為其封裝型別;
不同型別之間無法進行比較。
3)兩邊都是包裝型別:
如果是同類型包裝類的話,直接比較值;
如果是不同型別包裝類,不會進行拆裝箱,不能比較,編譯會報錯。