本系列主要是針對於基礎性常用的類型, 一個系統性的簡介
本文為概述
基礎性類型簡介
官方關於數據類型的介紹
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
java中的8種基本數據類型
每種數據類型還有他對應的包裝類
名稱 | 字節 | 取值范圍 | 默認值 |
byte | 1個字節 | -128 ~127 | 0 |
short | 2個字節 | -32,768 ~ 32,767 | 0 |
int | 4個字節 | -231 ~ 231-1 SE8以及之后,可以用int來表示無符號32位數 0~232-1 |
0 |
long | 8個字節 | -263 ~ 263-1
SE8以及之后,可以用long來表示無符號64位數
0~264-1
|
0L |
float | 4個字節 | 單精度 32-bit IEEE 754 浮點數 | 0.0f |
double | 8個字節 | 雙精度 64-bit IEEE 754 浮點數 | 0.0d |
char | 2個字節 | 16位 Unicode 字符 '\u0000' (or 0) ~ '\uffff' (65,535 包括) |
'\u0000' |
boolean | 字節大小並未規定,由實現決定 虛擬機內部沒有支持boolean的指令 boolean編譯之后使用虛擬機中的int代替 oracle公司的虛擬機實現中boolean數組編碼為byte數組 那就是一個boolean 一個字節 8位 |
true 或者 false | false |
另外為了方便還提供了 java.lang.String,他是不可變的,也不屬於基本數據類型,默認值為 null |
為了支持大數據的計算,還提供了BigInteger 和 BigDecimal |
所以說常用到的,基礎性的數據類型有: |
8種基本數據類型 byte short int long float double char boolean |
8種基本數據類型對應的包裝類 Byte Short Integer Long Float Double Character Boolean |
java.lang.String |
java.math.BigInteger 和 java.math.BigDecimal |
8個基本類型
11個Object類型
類層次結構
Number是對"數值"這兩個字的概念在Java中的抽象 Byte、Short、Integer、Long、Double、Float、BigDecimal、BigInteger 類的超類 |
規定了作為數值的協議 就是提供xxxValue方法以獲得各種不同的數據類型的值 在類型轉換之間可能會損失精度 |
![]() |
除了byte和short 上圖方法列表中的其他的方法 是必須提供的 ![]() |
共性特點
其他方法
二進制位數相關
計算機中整數是以二進制補碼形式存放的 Integer和Long提供了bitCount 方法 用於獲取二進制補碼表示形式的 1 位的數量 |
數據翻轉
數據為二進制表示形式,翻轉就是完全的顛倒過來 ,形象點說就是旋轉180度
最后一位變成了最先一位
Integer和Long提供了reverse 方法進行翻轉
|
按照字節翻轉,reverse是按照位翻轉,最后一位變成最先一位
reverseBytes 是按照字節翻轉,也就是最后一個字節變成了最先的一個字節
|
循環移位
循環移位就是循環移動位置 位置就這么多,循環移動就是從一頭到另一頭 移位負距離等同於在另一頭移位 ![]() |
rotateLeft 循環左移 對應上面一個圖,從最左邊(最高位)移出,從右邊最低位在進入 |
rotateRight
循環右移 對應下面一個圖,從最右邊(最低位)移出,從左邊最高位在進入
|
Integer和Long提供了循環右移和循環左移 |
最高1 位 和 最低 1位
前導零 后置零
無符號的求余取整運算
divideUnsigned(dividend, divisor) 求商,也就是取整 第一個參數除以第二個參數的商 remainderUnsigned(dividend,divisor)求余 第一個參數 除以 第二個參數的余數 |
Integer和Long 有提供 |
看得出來, 作為數值型的Integer 和 Long 提供了最多的方法支持
上面列出來的方法並不是每個類都有實現,但是至少出現在一個以上的類中
為了條理清晰,所以在此列出
注意點
getXXX系列
他的本意是確定具有指定名稱的系統屬性的整數值
而不是把一個字符串轉換為包裝類,所以一定不要想當然的把它當做解析
比如 getLong
他首先會System.getProperty
如果你傳遞的字符串根本就不是一個系統屬性的名稱,則根本就不會進行下去
而且,第二個值也不是基數,也就是我們說的進制,他是如果前面為null的話,給出的默認值
|
![]() |
測試一下![]() |
decode
接受通過以下語法給出的十進制、十六進制和八進制數字
Sign是可選的
|
Sign DecimalNumeral
Sign 0x HexDigits
Sign 0X HexDigits
Sign # HexDigits
Sign 0 OctalDigits
Sign:
-
+
|
decode 用於將字符串解碼為包裝類對象 不依賴於對象,所以是靜態方法 valueOf也可以將字符串或者基本類型包裝為對象 |
decode 不需要指定進制,可以識別前綴符號 0x 0X # 0
valueOf則不可以識別前綴,要么指定基數,要么就是默認十進制,而且他的參數只能是指定基礎的有效字符,不能有前綴符號
|
valueOf 與 new 對象
valueOf系列方法內部都有緩存,所以除非必須要創建對象,盡量使用valueOf
會對范圍內的數進行緩存,不在范圍內的將會new