關鍵字
位數、常量池、包裝類(自動裝拆箱)數組
8種基本數據類型
整數類型:byte,short,int,long
浮點數類型:float,double
字符類型:char
布爾類型:boolean緩存
位數
一、JVM規範中,boolean做爲int處理,佔4字節 ,boolean數組當作byte數組,佔1個字節。
二、byte類型是1byte也就是8位,能夠表示的數字是-128到127,由於還有一個0,加起來一共是256。ide
包裝類
能解決
一、基本類型並不具有對象的特性: 沒有成員變量,方法能夠調用。
二、不支持面向對象的變成機制(不可變),包裝類。Byte,Short,Integer,Long,Double,Float,Charater,Boolean。對象
JDK1.5,開始提供自動裝箱和拆箱功能,基本類型變量賦給對應的包裝類變量稱之爲裝箱。自動拆箱與之相反。
Java 7加強了包裝類的功能,爲全部的包裝類提供了一個靜態的compare(xxx val1,xxx val2)方法,來比較兩個基本類型值得大小。(解決 兩個128自動裝箱後,比較它們的大小並不相等問題)
Java 8再次加強包裝類的功能,能夠支持無符號運算。內存
基本類型和包裝類區別
一、聲明方式不一樣:包裝類型須要使用new關鍵字來在堆中分配存儲空間,基本類型不須要。
二、存儲方式及位置不一樣:基本類型存儲在棧中,而包裝類型是在堆中,而後經過引用來使用。
三、初始值不一樣:包裝類型的初始值爲null,基本類型的初始值 eg:int -> 0,boolean ->false。
四、使用場景不一樣:經常使用的集合如Collection、Map時必須使用包裝類(不可變性)。源碼
常量池
好處:
一、節省內存空間
二、提升運行效率
包裝類
Byte,Short,Integer,Long,Character,Boolean 5種 ,在 -128 ~ 127中用到常量池,會自動拆箱裝箱,其他數字範圍則會新建實例
兩種浮點數類型的包裝類Float,Double並無實現常量池技術it
基礎類型
被final修飾時:
若是是成員變量,必定會存入常量池,好比變量b;
若是是局部變量,既不會存入常量池,也不在棧中;io
沒有被final修飾時:
無論是成員變量仍是局部變量,都不必定會被存入常量池,int類型的變量會以2的15次方爲基準,大於等於這個數就會存入常量池,小於則不會;
可是double類型1d不會,2d會,這個緣由也沒找到是爲何;class
包裝類常見問題
一.數值包裝類
/ Integer案例/
Integer i1 = 128;
Integer i2 = 128;
Integer i3 = 127;
Integer i4 = 127;
System.out.println(i1 == i2);//false
System.out.println(i3==i4); //true
/ Long案例/
Long l1 = 128L;
Long l2 = 128L;
Long l3 = -128L;
Long l4 = -128L;
System.out.println(l1 == l2);//false
System.out.println(l3==l4);//true
/Float(Double)案例(造成對比)/
Float f1 = 128f;
Float f2 = 128f;
Float f3 = 127f;
Float f4 = 127f;
System.out.println(f1 == f2);//false
System.out.println(f3==f4);//false效率
二.原理
由於Byte,Integer,Long對在-128~127之間的數據進行了緩存,若是待轉換的數值 i 在該範圍了則直接從緩存取,而不是new Integer(i)。
Float和Double則是每次都new一個新的,沒有緩存機制,因此都爲false。
三.JDK源碼:
/Integer的實現/
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];//IntegerCache.high爲127,取緩存
else
return new Integer(i);
}
/Long的實現/
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
/Float的實現(無緩存)/public static Float valueOf(float f) {return new Float(f);}