我總結了Java數據比較主要有以下要點:
1.基本類型和基本類型對比;
2.基本類型和包裝類型比較;
3.包裝類型和包裝類型比較;
4.”==“與”equal“比較方式;
5.[-128,127]與非[-128,127]范圍的數據比較;
6.String包裝類型的比較。
基本類型和基本類型對比
基本類型和基本類型的比較,因為不是對象所以沒有equal方法也沒有所謂的引用地址,所以只能”==“來比較它們本身的值。
int a = 127; int b = 127; System.out.println("a==b, result:" + (a == b)); //a==b, result:true
基本類型與包裝類型比較
凡是基本類型和包裝類型比較都會觸發包裝類型自動拆箱的操作,最終還是比較本身的值。
int a = 127; Integer b = 127; System.out.println("a==b, result:" + (a == b)); //a==b, result:true
下面的情況與上面的類似,只不過Java在處理時少了自動裝箱的那一步,后面的拆箱比較是一樣的。
int a = 127; Integer b = new Integer(127); System.out.println("a==b, result:" + (a == b)); //a==b, result:true
包裝類型和包裝類型比較
這里還是暫時只討論”==“方式的比較,包裝類型之間采用”==“比較的是對象的地址。
包裝類型和包裝類型比較結果會受包裝類型對象的創建方式的影響,如”xxx.valueOf()“還是”new xxx()“方式。
xxx.valueOf()方式創建對象:這種方式Java遇到-128~127的值,會先去緩存池中根據值查找看是否有已存在的對象,如果有就直接將對象地址返回,如果沒有則創建。所以下面的例子中a和b的地址都是同一個對象地址,所以相等。
Integer a = Integer.valueOf(127); Integer b = Integer.valueOf(127); System.out.println("a==b, result:" + (a == b)); //a==b, result:true
new xxx()方式創建對象:這種方式Java不會檢查緩存池而是直接new一個新的對象,所以下面例子的兩個對象的地址肯定是不相等的。
Integer a = new Integer(127); Integer b = new Integer(127); System.out.println("a==b, result:" + (a == b)); //a==b, result:false
"=="與"equal"比較方式
equals屬於包裝類型對象的方法,Java默認equals方法是比較值,當然用戶也可以重寫該方法。
Integer a = new Integer(127); Integer b = new Integer(127); System.out.println("a==b, result:" + (a.equals(b))); // a==b, result:true
Integer a = new Integer(127);
int b = 127;
System.out.println("a==b, result:" + (a.equals(b))); // a==b, result:true
”==“相對於equals比較復雜,從上面的例子可以看出,除了”包裝類型和包裝類型“是比較地址,其它情況都是比較值。
[-128,127]與非[-128,127]范圍的數據比較
上面的范圍不是絕對的,用戶是可以對JVM進行配置的。
當對象的值在[-128,127]范圍內,Java會檢查緩存池,如果有該對象就直接返回,如果沒有則創建。如果范圍為非[-128,127],那么Java不會檢查。
可以總結的經驗是當用戶比較的是對象的地址才需要考慮值的范圍是否在[-128,127],如果是比較值,那么不用考慮。
String包裝類型的比較
String只有包裝類型,沒有基本類型,所以只討論包裝類型之間的比較。這里之所以將String單獨拿出來討論是因為String為字符串與數值類型的包裝對象有點不一樣,它有常量池還有字符串拼接等情況都會影響它是否創建新對象。
所以String的比較就留到下一篇文章再寫了。