咱們知道,Java是一種強類型語言,類型對於Java語言來講很是的重要不言而喻,在Java中,分爲基礎數據類型和引用數據類型,其中基礎數據類型分爲了四類八種:javascript
下面,咱們來分別說一下這四類八種java
首先,須要說明一點,在Java的整形中不存在unsigned
類型的數值,也就是說Java的整形都是有符號的可爲正,可爲負的整數面試
名稱 | 取值範圍 | 字節數 | 位數 | 包裝類 |
---|---|---|---|---|
byte | 到 | 1 | 8 | Byte |
short | 到 | 2 | 16 | Short |
int | 到 | 4 | 32 | Integer |
long | 到 | 8 | 64 | Long |
能夠看出,取值範圍取決於該類型的位數,因爲Java的代碼是運行在JVM中,因此該類型是獨立於機器以外存在的,與機器的關係並無很大,大大的提升了代碼的可移植性。數組
在書寫代碼的時候,咱們須要注意,在咱們定義一個long
類型的變量時,必定要記得在代碼後加上大寫的L(小寫的l在某些字體下容易被認證1,給代碼的可讀性帶來影響)。bash
咱們的整數默認類型是int類型,在咱們進行計算的時候,會默認按照int類型進行計算。數據結構
byte a = 127; //right
byte b = 1; //right
byte c = a + b; // wrong
byte d = 127 + 1; //wrong
複製代碼
編譯器報錯兩處,均是下面的這個錯誤信息:字體
HelloWorld.java:7: 錯誤: 不兼容的類型: 從int轉換到byte可能會有損失
byte c = a + b; // wrong
^
HelloWorld.java:9: 錯誤: 不兼容的類型: 從int轉換到byte可能會有損失
byte d = 127 + 1; //wrong
複製代碼
這是一道很常見的面試題,其中錯誤的緣由有兩點:spa
這裏很好的體現了整數類型的默認計算類型就是int類型~code
浮點型有兩種,一種是32位的float
類型(單精度),一種是64位的double
類型(雙精度)。cdn
名稱 | 取值範圍 | 字節數 | 位數 | 包裝類 |
---|---|---|---|---|
float | 大約 到 | 8 | 32 | Float |
double | 大約 到 | 16 | 64 | Double |
由於double
的取值範圍更廣,精度更高,因此咱們平常都是使用double
,默認的浮點類型也是double
。
從上面咱們能夠知道float是32位的,而long是64位的,下意識的咱們會認爲64位的取值範圍一定要大於32位的,但事實並不是如此:
float佔了4個字節,也就是32位,其中第一位是符號位,23位是尾數位,剩下的8位都是指數位,爲256,因爲(signed)符號數的緣由,也就是說,float的取值範圍大體位於到,是要遠遠的大於long的取值範圍的。
其實,這也詮釋了另一個浮點數問題,由於計算機是二進制的,因此沒法精確的表示出浮點數,可是Java也給咱們了一種解決方案,那就是咱們在涉及到浮點數比較敏感的地方(好比經緯度,金錢)的時候,必定要注意使用BigDecimal
傳參爲字符串的方式!
三個特殊的浮點數值:
- 正無窮大(Double.POSITIVE_INFINITY)
- 負無窮大(Double.NEGATIVE_INFINITY)
- NAN(Double.NaN)
char
關鍵字所修飾的類型是字符型,須要由單引號引發來,一個或兩個char
類型的數值能夠表示一個Unicode
字符,咱們所熟知的字符串底層數據結構正是一個字符數組常量:
/** The value is used for character storage. */
private final char value[];
複製代碼
char
類型實際上是由\u+十六進制數據的組成的
,最大值爲\uffff(65535)
,最小值爲\u0000(0)
。
這裏須要注意一些特殊的轉義字符:
轉義序列 | 名稱 | Unicode值 |
---|---|---|
\b | 退格 | \u0008 |
\t | 製表 | \u0009 |
\n | 換行 | \u000a |
\r | 回車 | \u000d |
\" | 雙引號 | \u0022 |
\' | 單引號 | \u0027 |
\\ | 反斜槓 | \u005c |
boolean
修飾的變量就是布爾型,布爾類型很簡單,只有true false
兩個值,可是這裏須要注意,和C++不一樣的地方是它不能由數字0或1轉換成布爾型。
byte a = 127; //right
byte b = 1; //right
byte c = a + b; // wrong
byte d = (byte)(a + b) // right
System.out.println(d);
複製代碼
仍是這個熟悉的例子,剛剛咱們已經分析了第三種狀況爲何會報錯,這裏咱們能夠經過強制類型轉換來強制完成這個操做。
強制類型轉換隻發生在位數較多的類型(int,64位)轉爲位數較少(byte,8位)的類型。
果不其然,咱們將第三句註釋掉以後,代碼能夠正常編譯經過,而後咱們去運行的時候,發現打印的d的值以下:
-128
複製代碼
這裏就說到了強制類型轉換會發生的一種狀況,若是被轉換的數值超出目標類型的取值範圍,就會發生數據的丟失。
二進制在計算的時候,發生了超出數據範圍的進位操做,隨着強制類型轉換,進位的部分被咔嚓掉,而後就發生這種狀況了(熟悉原反補的同窗應該明白這一點)。
JDK 10中推出了一種新的類型var
,猛地看起來很像javascript
中的var
,它能夠這麼玩:
var list = new ArrayList<String>();
var x = 3;
複製代碼
乍一看,還真的和javascript
有些像,但其實並否則,並不會影響Java是一個強類型語言的事實,它是基於局部變量推斷機制來完成的,編譯器在處理var時,先讀構造器,並將它做爲變量的類型,而後將該類型寫入字節碼當中。也就是說,該類型是沒法更改的。
var a = 3;
a = [1,2,3];
複製代碼
這樣的寫法在javascript
中毫無問題,可是在Java中就不行。可是須要注意,var
只能做用於帶有構造器的局部變量和for循環中。
原創文章,才疏學淺,若有不對之處,萬望告知!