本篇博文主要介紹 java 基礎數據類型、基本類型的數據轉換、自動裝箱拆箱機制。html
整型java
整型包含 byte(1字節)、short(2字節)、int(4字節)、long(8字節)數組
須要注意的是,若是直接將一個較小的數賦值給 byte 或者是 short 的話,系統會自動把該數值當成 byte 或者 short 類型處理:code
byte a = 56
當使用 long 類型時,須要在後面加上一個 L,若是沒有的話,仍然當成 int 類型。例如,下面的代碼就會報出編譯錯誤:htm
long bigValue = 999999999999
JDK7 新增了對二進制整數的支持,二進制的整數以 0b 或者 0B 開頭,如:對象
int binVal = 0b10000000000000000000000000000011
須要注意的是,全部數字在計算機底層都是以二進制形式存在的,而且是以補碼的形式保存全部整數。當咱們要計算一個二進制整數的值時,須要將補碼轉換爲原碼。他們之間的關係是:正數的原碼和補碼徹底相同,負數的補碼是其反碼加 1;反碼是對原碼按位取反,只是最高位(符號位)保持不變。例如,上述數值表示補碼,其反碼爲 10000000000000000000000000000010
,其原碼爲反碼取反 (符號位不變)11111111111111111111111111111110
,爲 -2147483645。blog
浮點型get
字符型源碼
布爾型博客
基本類型表示範圍小的數能夠向基本類型表示範圍大的數進行自動類型轉換:
byte --> char、short --> int --> long --> float --> double
強制類型轉換時容易出現溢出的狀況,例如:
int iValue = 233; byte bValue = (byte)iValue; System.out.println(bValue); // 結果爲 -23
在上述例子中,iValue 用二進制表示爲 00000000000000000000000011101001。當強制轉換成 byte 類型時,只能取後八位,即 11101001,二進制數是補碼,咱們把它轉換爲反碼爲 11101000,轉換爲原碼爲 10010111,此數值表示 -23。
// 下面的代碼會出現編譯錯誤 short sValue = 5; sValue = sValue - 2;
自動裝箱就是將基本數據類型轉換爲包裝類型;拆箱就是把包裝類型轉換爲基本數據類型,以 Integer 類型爲例:
public class Test{ public static void main(String[] args){ Integer i = 20; int n = i; } }
經過反編譯 class 文件以後獲得以下內容:
**能夠看出,在自動裝箱的過程當中,調用的是 Integer.valueOf 方法,而在自動拆箱的過程當中調用的 Integer.intValue 方法。**其餘的包裝類也是相似。有了上面的基礎,咱們來看看這段代碼的運行結果:
public class PackAndUnbox { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1 == i2); System.out.println(i3 == i4); } }
有上面所說的知識點能夠知道,這四個變量的定義都會自動裝箱,即調用 Integer.valueOf 方法。那咱們如今來看一下 Integer.valueOf 方法的源碼:
public static Integer valueOf(String s) { return Integer.valueOf(parseInt(s, 10)); } public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
從源碼可知,自動裝箱時,當數值在 [low,high] 之間時(經過查看源碼此範圍爲 -128,127),該數值能夠直接由 IntegerCache.cache 數組生成,並且該數組由 static final 修飾,所以返回的對象應該是相等的。由此能夠得出,上面程序的運行結果以下:
true; false;
當其餘包裝類自動裝箱時,若是要判斷兩個對象是否相等,判斷的依據也是各個包裝類的 valueOf 方法,這裏就再也不繼續展開,詳細的你們能夠自行去查看源碼或者查閱網上的博客,就好比這 一篇。