[一]基礎類型概述

 
本系列主要是針對於基礎性經常使用的類型, 一個系統性的簡介
本文爲概述
 
基礎性類型簡介
 
官方關於數據類型的介紹
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類型
 
 
類層次結構
image_5ba982a6_2da4
 
Number是對"數值"這兩個字的概念在Java中的抽象
Byte、Short、Integer、Long、Double、Float、BigDecimal、BigInteger  類的超類
規定了做爲數值的協議  就是提供xxxValue方法以得到各類不一樣的數據類型的值
在類型轉換之間可能會損失精度 
image_5ba982a6_7e1a
除了byte和short
上圖方法列表中的其餘的方法   是必須提供的
image_5ba982a6_5b88
 
 
共性特色
 
image_5ba982a6_14bb
比較
11個Object類型,所有都實現了Comparable
也就意味着均可以進行比較
parseXXX  系列
字符串形式數值解析爲基本類型數值
 
數值型的基本數據類型的包裝類
也就是Byte    Short     Integer     Long     Float     Double    都有此係列方法  
image_5ba982a6_2bcb
valueOf     系列
包裝爲對象類型
基本數據類型的包裝類,天然能夠將基本類型包裝成包裝類
 
VaueOf系列基本都有對應的緩存區
緩存區範圍內的對象重複使用,對象爲同一個
 
對於String和BigInteger 和 BigDecimal 也有用於包裝的方法
image_5ba982a6_13d2
decode 字符串形式數值解析後,包裝成對象
不須要傳遞基數,能夠根據字符串自行判斷
image_5ba982a6_65c5


XXXValue  系列
基本類型值
對於Number的子類,都有做爲數值須要提供的
轉換爲基本類型數據的方法
image_5ba982a6_5ccb
toUnsignedXXX 系列 無符號數相關
對於Byte    Short    Integer    Long  四種整型的包裝類
都有無符號的形式的方法      

toString  toXXXString  系列 轉換爲字符串形式
equals 他們都重寫了equals方法
比較的是實際的數據內容,而不是地址
hashCode   
getXXX系列
肯定具備指定名稱的系統屬性的各類類型的值
Integer 和 Long有此係列方法
image_5ba982a6_504e
Byte    Short    Integer    Long    Float    Double
Boolean  Character
 
內部都有一個value 屬性
爲基本數據類型
XXX(基本類型)
XXX(String s)
數值型包裝類的構造方法多爲兩種:
一種是直接藉助於基本類型數據
另外一種是內部藉助於ParseXXX方法進行轉換爲基本類型,而後在返回對象
 
其餘方法

二進制位數相關

計算機中整數是以二進制補碼形式存放的
Integer和Long提供了bitCount  方法 用於獲取二進制補碼錶示形式的 1 位的數量
 
數據翻轉
數據爲二進制表示形式,翻轉就是徹底的顛倒過來 ,形象點說就是旋轉180度
最後一位變成了最早一位 
Integer和Long提供了reverse  方法進行翻轉
按照字節翻轉,reverse是按照位翻轉,最後一位變成最早一位
reverseBytes 是按照字節翻轉,也就是最後一個字節變成了最早的一個字節
 
循環移位
循環移位就是循環移動位置
位置就這麼多,循環移動就是從一頭到另外一頭
移位負距離等同於在另外一頭移位
image_5ba982a6_4e72
rotateLeft
循環左移 對應上面一個圖,從最左邊(最高位)移出,從右邊最低位在進入
rotateRight
循環右移 對應下面一個圖,從最右邊(最低位)移出,從左邊最高位在進入
Integer和Long提供了循環右移和循環左移
 
最高1 位 和 最低 1位
前導零 後置零
這幾個方法只須要知道用法含義,實現的邏輯背後都是有理論依據的
數據都是二進制形式
左邊爲高位  右邊爲低位
從最左邊也就是最高位  往右邊挨個位查找,只要找到了這個 1  全部的其餘位都置零  獲得的這個數就是最高1 位的數值
從最右邊也就是最低位  往左邊挨個位查找,只要找到了這個 1  全部的其餘位都置零  獲得的這個數就是最低1 位的數值
highestOneBit表示從最左邊查找第一個1,那麼第一個1 左邊,確定所有都是0
這些0 就是numberOfLeadingZeros
看得出來,   highestOneBit與numberOfLeadingZeros相對應,能夠互相轉化的

同理lowestOneBit 表示最右邊查找第一個1 那麼第一個1 右邊,確定所有都是0
這些0就是numberOfTrailingZeros
看得出來, lowestOneBit 與 numberOfTrailingZeros相對應,能夠互相轉化的
image_5ba982a7_6fff
Integer和Long  提供了這幾個方法
 
無符號的求餘取整運算
divideUnsigned(dividend, divisor)  求商,也就是取整 第一個參數除以第二個參數的商
remainderUnsigned(dividend,divisor)求餘  第一個參數 除以 第二個參數的餘數
Integer和Long  有提供
 
看得出來, 做爲數值型的Integer 和 Long  提供了最多的方法支持
上面列出來的方法並非每一個類都有實現,可是至少出如今一個以上的類中
爲了條理清晰,因此在此列出
 
 
注意點
 
getXXX系列
他的本意是肯定具備指定名稱的系統屬性的整數值
而不是把一個字符串轉換爲包裝類,因此必定不要想固然的把它當作解析
好比 getLong
他首先會System.getProperty 
若是你傳遞的字符串根本就不是一個系統屬性的名稱,則根本就不會進行下去
並且,第二個值也不是基數,也就是咱們說的進制,他是若是前面爲null的話,給出的默認值
image_5ba982a7_4830
測試一下
image_5ba982a7_648f
 
 
 
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 
相關文章
相關標籤/搜索