[Google Guava] 7-原生型別
概述
Java的原生型別就是指基本型別:byte、short、int、long、float、double、char和boolean。
在從Guava查詢原生型別方法之前,可以先查查Arrays類,或者對應的基礎型別包裝類,如Integer。
原生型別不能當作物件或泛型的型別引數使用,這意味著許多通用方法都不能應用於它們。Guava提供了若干通用工具,包括原生型別陣列與集合API的互動,原生型別和位元組陣列的相互轉換,以及對某些原生型別的無符號形式的支援。
Bytes工具類沒有定義任何區分有符號和無符號位元組的方法,而是把它們都放到了SignedBytes和UnsignedBytes工具類中,因為位元組型別的符號性比起其它型別要略微含糊一些。
int和long的無符號形式方法在UnsignedInts和UnsignedLongs類中,但由於這兩個型別的大多數用法都是有符號的,Ints和Longs類按照有符號形式處理方法的輸入引數。
此外,Guava為int和long的無符號形式提供了包裝類,即UnsignedInteger和UnsignedLong,以幫助你使用型別系統,以極小的效能消耗對有符號和無符號值進行強制轉換。
在本章下面描述的方法簽名中,我們用Wrapper表示JDK包裝類,prim表示原生型別。(Prims表示相應的Guava工具類。)
原生型別陣列工具
原生型別陣列是處理原生型別集合的最有效方式(從記憶體和效能雙方面考慮)。Guava為此提供了許多工具方法。
方法簽名 | 描述 | 類似方法 | 可用性 |
List<Wrapper> asList(prim… backingArray) | 把陣列轉為相應包裝類的List | 符號無關* | |
prim[] toArray(Collection<Wrapper> collection) | 把集合拷貝為陣列,和collection.toArray()一樣執行緒安全 | 符號無關 | |
prim[] concat(prim[]… arrays) | 串聯多個原生型別陣列 | 符號無關 | |
boolean contains(prim[] array, prim target) | 判斷原生型別陣列是否包含給定值 | 符號無關 | |
int indexOf(prim[] array, prim target) | 給定值在陣列中首次出現處的索引,若不包含此值返回-1 | 符號無關 | |
int lastIndexOf(prim[] array, prim target) | 給定值在陣列最後出現的索引,若不包含此值返回-1 | 符號無關 | |
prim min(prim… array) | 陣列中最小的值 | 符號相關* | |
prim max(prim… array) | 陣列中最大的值 | 符號相關 | |
String join(String separator, prim… array) | 把陣列用給定分隔符連線為字串 | 符號相關 | |
Comparator<prim[]> lexicographicalComparator() | 按字典序比較原生型別陣列的Comparator | 符號相關 |
*符號無關方法存在於Bytes, Shorts, Ints, Longs, Floats, Doubles, Chars, Booleans。而UnsignedInts, UnsignedLongs, SignedBytes, 或UnsignedBytes不存在。
*符號相關方法存在於SignedBytes, UnsignedBytes, Shorts, Ints, Longs, Floats, Doubles, Chars, Booleans, UnsignedInts, UnsignedLongs。而Bytes不存在。
通用工具方法
Guava為原生型別提供了若干JDK6沒有的工具方法。但請注意,其中某些方法已經存在於JDK7中。
方法簽名 | 描述 | 可用性 |
int compare(prim a, prim b) | 傳統的Comparator.compare方法,但針對原生型別。JDK7的原生型別包裝類也提供這樣的方法 | 符號相關 |
prim checkedCast(long value) | 把給定long值轉為某一原生型別,若給定值不符合該原生型別,則丟擲IllegalArgumentException | 僅適用於符號相關的整型* |
prim saturatedCast(long value) | 把給定long值轉為某一原生型別,若給定值不符合則使用最接近的原生型別值 | 僅適用於符號相關的整型 |
*這裡的整型包括byte, short, int, long。不包括char, boolean, float, 或double。
**譯者注:不符合主要是指long值超出prim型別的範圍,比如過大的long超出int範圍。
注:com.google.common.math.DoubleMath提供了舍入double的方法,支援多種舍入模式。相見第12章的”浮點數運算”。
位元組轉換方法
Guava提供了若干方法,用來把原生型別按大位元組序與位元組陣列相互轉換。所有這些方法都是符號無關的,此外Booleans沒有提供任何下面的方法。
方法或欄位簽名 | 描述 |
int BYTES | 常量:表示該原生型別需要的位元組數 |
prim fromByteArray(byte[] bytes) | 使用位元組陣列的前Prims.BYTES個位元組,按大位元組序返回原生型別值;如果bytes.length <= Prims.BYTES,丟擲IAE |
prim fromBytes(byte b1, …, byte bk) | 接受Prims.BYTES個位元組引數,按大位元組序返回原生型別值 |
byte[] toByteArray(prim value) | 按大位元組序返回value的位元組陣列 |
無符號支援
JDK原生型別包裝類提供了針對有符號型別的方法,而UnsignedInts和UnsignedLongs工具類提供了相應的無符號通用方法。UnsignedInts和UnsignedLongs直接處理原生型別:使用時,由你自己保證只傳入了無符號型別的值。
此外,對int和long,Guava提供了無符號包裝類(UnsignedInteger和UnsignedLong),來幫助你以極小的效能消耗,對有符號和無符號型別進行強制轉換。
無符號通用工具方法
JDK的原生型別包裝類提供了有符號形式的類似方法。
無符號包裝類
無符號包裝類包含了若干方法,讓使用和轉換更容易。
方法簽名 | 說明 |
UnsignedPrim add(UnsignedPrim), subtract, multiply, divide, remainder | 簡單算術運算 |
UnsignedPrim valueOf(BigInteger) | 按給定BigInteger返回無符號物件,若BigInteger為負或不匹配,丟擲IAE |
UnsignedPrim valueOf(long) | 按給定long返回無符號物件,若long為負或不匹配,丟擲IAE |
UnsignedPrim asUnsigned(prim value) | 把給定的值當作無符號型別。例如,UnsignedInteger.asUnsigned(1<<31)的值為231,儘管1<<31當作int時是負的 |
BigInteger bigIntegerValue() | 用BigInteger返回該無符號物件的值 |
toString(), toString(int radix) | 返回無符號值的字串表示 |
譯者注:UnsignedPrim指各種無符號包裝類,如UnsignedInteger、UnsignedLong。