[一]基礎類型概述


 
本系列主要是針對於基礎性常用的類型, 一個系統性的簡介
本文為概述
 
基礎性類型簡介
 
官方關於數據類型的介紹
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 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM