JAVA有8種基本類型:大致分為3類:字符,布爾,數值類型
byte:8位,最大存儲數據量是255,存放的數據范圍是-128~127之間。
short:16位,最大數據存儲量是65536,數據范圍是-32768~32767之間。
int:32位,最大數據存儲容量是2的32次方減1,數據范圍是負的2的31次方到正的2的31次方減1。
long:64位,最大數據存儲容量是2的64次方減1,數據范圍為負的2的63次方到正的2的63次方減1。
float:32位,數據范圍在3.4e-45~1.4e38,直接賦值時必須在數字后加上f或F。
double:64位,數據范圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加。
boolean:只有true和false兩個取值。
在 Java 5 中,引入了自動裝箱和自動拆箱功能(boxing/unboxing),Java 可以根據上下文,自動進行轉換,極大地簡化了相關編程。以 Integer 的值緩存為例,這涉及 Java 5 中另一個改進。構建 Integer 對象的傳統方式是直接調用構造器,直接 new 一個對象。但是根據實踐,我們發現大部分數據操作都是集中在有限的、較小的數值范圍,因而,在 Java 5 中新增了靜態工廠方法 valueOf,在調用它的時候會利用一個緩存機制,帶來了明顯的性能改進。
基礎數據類型與包裝類對應關系與緩存值范圍如下下表所示
對應關系與緩存值范圍
Java 里的兩個基礎要素:原始數據類型、包裝類,說到這里就要談到自動裝箱、自動拆箱機制。自動裝箱實際上算是一種語法糖,Java 平臺為我們自動進行了一些轉換,它們發生在編譯階段。
上面講解了知識與定義,下面我們說一下在什么場景下使用最優:
1、緩存范圍內使用速度最快。
2、對數據庫的操作,需要對數值類型進行判空。
實際使用中應該注意哪些坑與面試點
1.返回類型與方法的出參要保持一致,否則會導致自動拆箱與裝箱的性能損耗。如下:
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
2.包裝類型的默認值是 null,而基本類型的默認值都不是null
3.推薦所有包裝類對象之間的值比較使用 equlas() 方法,因為包裝類的非高頻區數據會在堆上產生,而高頻區又會復用已有對象,這樣會導致同樣的代碼,因為取值的不同,而產生兩種截然不同的結果
4.面試題,如下的輸出結果是什么?
public static void main(String[] args) {
Integer num1 = -128;
Integer num2 = -128;
System.out.println("值為-128 => " + (num1 == num2));
Integer num3 = 666;
Integer num4 = 666;
System.out.println("值為666 => " + (num3 == num4));
}
輸入結果為:
值為-128 => true
值為666 => false
結果解析:
因為Integer緩存值范圍為:-128到127,-128剛好在范圍內,其實兩個變量都是指向的同一個靜態值,而對于超過這個范圍的值,會new一個對象
public static Integer valueOf(int i) {
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}