深入分析Java數據類型「Java的八大基本數據類型」

Java數據類型系列之八大基本數據類型

八大基本數據類型

自從Java發佈以來,基本數據類型就是Java語言的一部分,分別是byte, short, int, long, char, float, double, boolean.當然圍繞着這些基本數據類型衍生出來了很多面試題,但是說實話,工作中基本用不到

例如:

boolean 占幾個位元組,char 是否可以表示漢字 等等

其中八大類型又可以分為四種,也就是下面的劃分:

​ 整型:byte, short, int, long

​ 字符型:char

​ 浮點型:float, double

​ 布爾型:boolean

​ 在詳細介紹之前,先科普一下,Java中最小的計算單元為位元組,1位元組=8位(bit)。下面我們列出了每個基本類型對應的默認值

數據類型默認值
byte0
short0
int0
long0L
float0.0f
double0.0d
char‘u0000’
String (or any object)null
booleanfalse

這裡還要科普一點,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結構

包含三部分:符號位、指數位、尾數位

Java數據類型系列之八大基本數據類型

2. float取值

Java數據類型系列之八大基本數據類型

注意:根據指數位和尾數位的取值不同,還有很多特殊情況,如NAN,正無窮,負無窮,但平時基本不會用到,這裡不再深入;同時由於是近似值,因此無法表示金額,表示金額建議使用BigDecimal

double

double屬於Java中的浮點型,也叫雙精度浮點型,長度為8位元組64bit,變量初始化默認值0.0d,包裝類Double

1. double結構

包含三部分:符號位、指數位、尾數位

Java數據類型系列之八大基本數據類型

2. double取值

正規形式:

Java數據類型系列之八大基本數據類型

非正規形式:

Java數據類型系列之八大基本數據類型

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

Java數據類型系列之八大基本數據類型

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

Java數據類型系列之八大基本數據類型

(最大值,當符號位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 類型的運算結果是什麼

Java數據類型系列之八大基本數據類型

可以看出運算的結果是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
Java數據類型系列之八大基本數據類型

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 在為了高性能上做的付出。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/284322.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-22 15:07
下一篇 2024-12-22 15:07

相關推薦

發表回復

登錄後才能評論