天天看點

java 包裝資料類型_Java基礎 (2) - 基本資料類型及包裝類

關鍵字

位數、常量池、包裝類(自動裝拆箱)

8種基本資料類型

整數類型:byte,short,int,long

浮點數類型:float,double

字元類型:char

布爾類型:boolean

位數

1、JVM規範中,boolean作為int處理,占4位元組 ,boolean數組當做byte數組,占1個位元組。

2、byte類型是1byte也就是8位,可以表示的數字是-128到127,因為還有一個0,加起來一共是256。

包裝類

能解決

1、基本類型并不具備對象的特性: 沒有成員變量,方法可以調用。

2、不支援面向對象的變成機制(不可變),包裝類。Byte,Short,Integer,Long,Double,Float,Charater,Boolean。

JDK1.5,開始提供自動裝箱和拆箱功能,基本類型變量賦給對應的包裝類變量稱之為裝箱。自動拆箱與之相反。

Java 7增強了包裝類的功能,為所有的包裝類提供了一個靜态的compare(xxx val1,xxx val2)方法,來比較兩個基本類型值得大小。(解決 兩個128自動裝箱後,比較它們的大小并不相等問題)

Java 8再次增強包裝類的功能,可以支援無符号運算。

基本類型和包裝類差別

1、聲明方式不同:包裝類型需要使用new關鍵字來在堆中配置設定存儲空間,基本類型不需要。

2、存儲方式及位置不同:基本類型存儲在棧中,而包裝類型是在堆中,然後通過引用來使用。

3、初始值不同:包裝類型的初始值為null,基本類型的初始值 eg:int -> 0,boolean ->false。

4、使用場景不同:常用的集合如Collection、Map時必須使用包裝類(不可變性)。

常量池

好處:

1、節省記憶體空間

2、提高運作效率

包裝類

Byte,Short,Integer,Long,Character,Boolean 5種 ,在 -128 ~ 127中用到常量池,會自動拆箱裝箱,其餘數字範圍則會建立執行個體

兩種浮點數類型的包裝類Float,Double并沒有實作常量池技術

基礎類型

被final修飾時:

如果是成員變量,一定會存入常量池,比如變量b;

如果是局部變量,既不會存入常量池,也不在棧中;

沒有被final修飾時:

不管是成員變量還是局部變量,都不一定會被存入常量池,int類型的變量會以2的15次方為基準,大于等于這個數就會存入常量池,小于則不會;

但是double類型1d不會,2d會,這個原因也沒找到是為什麼;

包裝類常見問題

一.數值包裝類

/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);

}