

八大基本數據類型
自從Java發布以來,基本數據類型就是Java語言的一部分,分別是byte, short, int, long, char, float, double, boolean.當然圍繞著這些基本數據類型衍生出來了很多面試題,但是說實話,工作中基本用不到
例如:
boolean 占幾個字節,char 是否可以表示漢字 等等
其中八大類型又可以分為四種,也就是下面的劃分:
? 整型:byte, short, int, long
? 字符型:char
? 浮點型:float, double
? 布爾型:boolean
? 在詳細介紹之前,先科普一下,Java中最小的計算單元為字節,1字節=8位(bit)。下面我們列出了每個基本類型對應的默認值
數據類型 | 默認值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘u0000’ |
String (or any object) | null |
boolean | false |
這里還要科普一點,java 編程語言是一門靜態類型的編程語言,也就是說你必須先申明變量然后才能使用它,所以你必須不要先申明變量的類型,就像下面一樣
int test = 1;
復制代碼
這樣就告訴了你的程序,test 變量已經存在,并且是int 類型,擁有初始值是1,java 中的變量類型大致分為兩類,一類是基本類型,也就是我們今天學的這種,另外一類是引用類型。
為什么需要基本類型
其實在學習這一節之前你需要有點基本知識,那就是包裝類型,你可以看我寫的這一篇文章Java數據類型—包裝類,你只需要知道java 為八大基本了下都提供了包裝類,而且在文章中提到了Java 是面向對象的編程語言,那么Java 為什么有提供了基本數據類型,這種不屬于對象類型的數據類型呢?
這是因為在Java 中對象的創建一件代價比較大的事情,再加上基本數據類型又是使用的非常廣泛的,和String一樣,我們知道Java 對String 做了很多優化,這里Java 為了提高程序的效率,提供了基本數據類型,后面你也會學到Java 也為基本數據了下提供了緩存。
需要注意的是包裝類型都是不可變的
一. 整型
Java中整型數據屬于有符號數,即第一個bit位為0表示正整數,第一個bit位為1表示負整數。在計算機中負數由補碼表示,那么補碼如何計算呢?
補碼=源碼取反 + 1;
如:
22,在計算機中的表示為00010110,
-22,取反:11101001,加1:11101010
byte
byte屬于Java中的整型,長度為1字節8bit,取值10000000(-128)到 01111111(127),變量初始化默認值為0,包裝類Byte
short
short屬于Java中的整型,長度為2字節16bit,取值10000000 00000000(-32768)到 01111111 11111111(32767),變量初始化默認值為0,包裝類Short
int
int屬于Java中的整型,長度為4字節32bit,取值-2^31 (-2,147,483,648)到 2^31-1(2,147,483,647),變量初始化默認值為0,包裝類Integer
long
long屬于Java中的整型,長度為8字節64bit,取值-2^63 (-9,223,372,036,854,775,808?)到 2^63-1(9,223,372,036,854,775,8087),變量初始化默認值為0或0L,包裝類Long
二. 浮點型
Java中浮點型數據無法由二進制直接表示,而是一種對于實數的近似數據表示法,它遵循[IEEE 754](baike.baidu.com/item/IEEE 754/3869922)標準
float
float屬于Java中的浮點型,也叫單精度浮點型,長度為4字節32bit,變量初始化默認值0.0f,包裝類Float
1. float結構
包含三部分:符號位、指數位、尾數位


2. float取值


注意:根據指數位和尾數位的取值不同,還有很多特殊情況,如NAN,正無窮,負無窮,但平時基本不會用到,這里不再深入;同時由于是近似值,因此無法表示金額,表示金額建議使用BigDecimal
double
double屬于Java中的浮點型,也叫雙精度浮點型,長度為8字節64bit,變量初始化默認值0.0d,包裝類Double
1. double結構
包含三部分:符號位、指數位、尾數位


2. double取值
正規形式:


非正規形式:


根據上面公式很容易計算出double的取值范圍為:


(最小值,當符號位S取1,指數位E取2047)


(最大值,當符號位S取0,指數位E取2047)
能取到其間的近似數據。
注意:根據指數位和尾數位的取值不同,還有很多特殊情況,如NAN,正無窮,負無窮,但平時基本不會用到,這里不再深入;同時由于是近似值,因此無法表示金額,表示金額建議使用BigDecimal
三. 字符型
char
char屬于java中的字符型,占2字節16bit,可以賦值單字符以及整型數值, 變量初始化無默認值,包裝類Character。
如:
char a = ‘a’;
char a = ‘中’;
char a = 12; // 取值范圍0~65536,因為char類型在ASCII字符編碼中,有對應的數值,可直接做運算,輸出字符表中對應的字符
@Test
public void testChar() {
//任意單個字符,加單引號。
char a1 = 'a';
//任意單個中文字,加單引號。
char a2 = '你';
//整數。0~65535。十進制、八進制、十六進制均可。輸出字符編碼表中對應的字符。
char a3 = 114;
System.out.println(a3);
}
還有一點就是char 類型支持數學運算,背后的原理就是char 可以轉化成對應的數字,然后數字計算之后,又可以對應到字符表中的字符,所以運算結果就是新的字符,下面給了一個截圖,給大家看一下char 類型的運算結果是什么


可以看出運算的結果是int 類型,只不過這個int 類型要想賦值給char ,還有一個范圍的要求0~65536
還有一點就是,我們經常習慣在做字符串拼接的時候使用+ 所以當你想拼接兩個字符的時候,不能直接使用+ 拼接,因為那是加法運算對于char 類型,所以你基本上可以把char 類型看成數值類型
@Test
public void testCharOperation() {
char a1 = 'a' + 'b';
System.out.println(a1);
String a2 = "a" + "b";
System.out.println(a2);
}
// 輸出結果
?
ab
所以當我們得到可以基本上將char 看做數值類型的時候,我們就可以嘗試將char 類型和數值類型進行計算,快去試試吧,還是我先試試
@Test
public void testCharOperation() {
char a1 = 'a' + 1;
System.out.println(a1);
}
//輸出結果
b
四. 布爾型
boolean 僅有兩個值true, false,變量初始化默認值false
boolean 到底占幾個字節
為什么要問這個問題,首先在Java中定義的八種基本數據類型中,除了其它七種類型都有明確的內存占用字節數外,就boolean類型沒有給出具體的占用字節數,因為對虛擬機來說根本就不存在 boolean 這個類型,boolean類型在編譯后會使用其他數據類型來表示,那boolean類型究竟占用多少個字節?當然這個時候你就會聽到很多種答案
首先我們看一下如何查看其它基本數據類型鎖占用的字節大小,因為你經常看到一張圖或者表格關于基本類型所占字節的大小,但是你又記不住,哈哈,只要你知道有下面這個方法,下次就有可以不用百度了,自己動手就可以了
System.out.println(Byte.SIZE);// 8
System.out.println(Short.SIZE);// 16
System.out.println(Integer.SIZE); //32
System.out.println(Long.SIZE); //64
System.out.println(Character.SIZE); //16
System.out.println(Float.SIZE); //64
System.out.println(Double.SIZE); //64
//System.out.println(Boolean.SIZE); //32
輸出結果,但是需要注意的實boolean 的包裝類Boolean卻沒有提供這樣的屬性
8
16
32
64
16
32
64


1 bit
理由是boolean類型的值只有true和false兩種邏輯值,在編譯后會使用1和0來表示,這兩個數在內存中只需要1位(bit)即可存儲,位是計算機最小的存儲單位。
1 byte
理由是雖然編譯后1和0只需占用1位空間,但計算機處理數據的最小單位是1個字節,1個字節等于8位,實際存儲的空間是:用1個字節的最低位存儲,其他7位用0填補,如果值是true的話則存儲的二進制為:0000 0001,如果是false的話則存儲的二進制為:0000 0000。
4 byte
理由來源是《Java虛擬機規范》一書中的描述:“雖然定義了boolean這種數據類型,但是只對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節碼指令,Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替,而boolean數組將會被編碼成Java虛擬機的byte數組,每個元素boolean元素占8位”。這樣我們可以得出boolean類型占了單獨使用是4個字節,在數組中又是1個字節。
那虛擬機為什么要用int來代替boolean呢?為什么不用byte或short,這樣不是更節省內存空間嗎。經過查閱資料發現,使用int的原因是,對于當下32位的處理器(CPU)來說,一次處理數據是32位(這里不是指的是32/64位系統,而是指CPU硬件層面),具有高效存取的特點
Although the java virtual machine defines a boolean type,it only provides very limited support for it.There are no java virtual machine instructions solely dedicated to operations on boolean values. Instead, expressions in the java programming language that operate on boolean values are compiled to use values of the java virtual machine int data type.
The java virtual machine does directly support boolean arrays. Its newarray instruction enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instruction baload and bastore .
In Oracle java virtual machine implementation, boolean arrays in the java programming language are encoded as java virtual machine byte arrays, using 8 bits per boolean element .
The java virtual machine encodes boolean array components using 1 to represent true and 0 to represent false . Where java programming language boolean values are mapped by compilers to values of java virtual machine type int , the compilers must use the same encoding
其實可以看出這也是Java 在為了高性能上做的付出。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。