Java 的原生類型就是指基本類型:byte、short、int、long、float、double、char 和 boolean。
在從 Guava 查找原生類型方法之前,可以先查查 Arrays 類,或者對(duì)應(yīng)的基礎(chǔ)類型包裝類,如 Integer。
原生類型不能當(dāng)作對(duì)象或泛型的類型參數(shù)使用,這意味著許多通用方法都不能應(yīng)用于它們。Guava 提供了若干通用工具,包括原生類型數(shù)組與集合 API 的交互,原生類型和字節(jié)數(shù)組的相互轉(zhuǎn)換,以及對(duì)某些原生類型的無符號(hào)形式的支持。
原生類型 | Guava 工具類(都在 com.google.common.primitives 包) |
byte | Bytes, SignedBytes, UnsignedBytes |
short | Shorts |
int | Ints, UnsignedInteger, UnsignedInts |
long | Longs, UnsignedLong, UnsignedLongs |
float | Floats |
double | Doubles |
char | Chars |
boolean | Booleans |
Bytes 工具類沒有定義任何區(qū)分有符號(hào)和無符號(hào)字節(jié)的方法,而是把它們都放到了 SignedBytes 和 UnsignedBytes 工具類中,因?yàn)樽止?jié)類型的符號(hào)性比起其它類型要略微含糊一些。
int 和 long 的無符號(hào)形式方法在 UnsignedInts 和 UnsignedLongs 類中,但由于這兩個(gè)類型的大多數(shù)用法都是有符號(hào)的,Ints 和 Longs 類按照有符號(hào)形式處理方法的輸入?yún)?shù)。
此外,Guava 為 int 和 long 的無符號(hào)形式提供了包裝類,即 UnsignedInteger 和 UnsignedLong,以幫助你使用類型系統(tǒng),以極小的性能消耗對(duì)有符號(hào)和無符號(hào)值進(jìn)行強(qiáng)制轉(zhuǎn)換。
在本章下面描述的方法簽名中,我們用 Wrapper 表示 JDK 包裝類,prim 表示原生類型。(Prims 表示相應(yīng)的 Guava 工具類。)
原生類型數(shù)組是處理原生類型集合的最有效方式(從內(nèi)存和性能雙方面考慮)。Guava 為此提供了許多工具方法。
方法簽名 | 描述 | 類似方法 | 可用性 |
List<Wrapper> asList(prim… backingArray) | 把數(shù)組轉(zhuǎn)為相應(yīng)包裝類的 List | Arrays.asList | 符號(hào)無關(guān)* |
prim[] toArray(Collection<Wrapper> collection) | 把集合拷貝為數(shù)組,和 collection.toArray()一樣線程安全 | Collection.toArray() | 符號(hào)無關(guān) |
prim[] concat(prim[]… arrays) | 串聯(lián)多個(gè)原生類型數(shù)組 | Iterables.concat | 符號(hào)無關(guān) |
boolean contains(prim[] array, prim target) | 判斷原生類型數(shù)組是否包含給定值 | Collection.contains | 符號(hào)無關(guān) |
int indexOf(prim[] array, prim target) | 給定值在數(shù)組中首次出現(xiàn)處的索引,若不包含此值返回-1 | List.indexOf | 符號(hào)無關(guān) |
int lastIndexOf(prim[] array, prim target) | 給定值在數(shù)組最后出現(xiàn)的索引,若不包含此值返回-1 | List.lastIndexOf | 符號(hào)無關(guān) |
prim min(prim… array) | 數(shù)組中最小的值 | Collections.min | 符號(hào)相關(guān)* |
prim max(prim… array) | 數(shù)組中最大的值 | Collections.max | 符號(hào)相關(guān) |
String join(String separator, prim… array) | 把數(shù)組用給定分隔符連接為字符串 | Joiner.on(separator).join | 符號(hào)相關(guān) |
Comparator<prim[]> lexicographicalComparator() | 按字典序比較原生類型數(shù)組的 Comparator | Ordering.natural().lexicographical() | 符號(hào)相關(guān) |
*符號(hào)無關(guān)方法存在于 Bytes, Shorts, Ints, Longs, Floats, Doubles, Chars, Booleans。而UnsignedInts, UnsignedLongs, SignedBytes, 或 UnsignedBytes 不存在。
*符號(hào)相關(guān)方法存在于 SignedBytes, UnsignedBytes, Shorts, Ints, Longs, Floats, Doubles, Chars, Booleans, UnsignedInts, UnsignedLongs。而 Bytes 不存在。
Guava 為原生類型提供了若干 JDK6 沒有的工具方法。但請(qǐng)注意,其中某些方法已經(jīng)存在于 JDK7 中。
方法簽名 | 描述 | 可用性 |
int compare(prim a, prim b) | 傳統(tǒng)的 Comparator.compare 方法,但針對(duì)原生類型。JDK7 的原生類型包裝類也提供這樣的方法 | 符號(hào)相關(guān) |
prim checkedCast(long value) | 把給定 long 值轉(zhuǎn)為某一原生類型,若給定值不符合該原生類型,則拋出 IllegalArgumentException | 僅適用于符號(hào)相關(guān)的整型* |
prim saturatedCast(long value) | 把給定 long 值轉(zhuǎn)為某一原生類型,若給定值不符合則使用最接近的原生類型值 | 僅適用于符號(hào)相關(guān)的整型 |
*這里的整型包括 byte, short, int, long。不包括 char, boolean, float, 或 double。
**譯者注:不符合主要是指 long 值超出 prim 類型的范圍,比如過大的 long 超出 int 范圍。
注:com.google.common.math.DoubleMath 提供了舍入 double 的方法,支持多種舍入模式。相見第 12 章的”浮點(diǎn)數(shù)運(yùn)算”。
Guava 提供了若干方法,用來把原生類型按大字節(jié)序與字節(jié)數(shù)組相互轉(zhuǎn)換。所有這些方法都是符號(hào)無關(guān)的,此外 Booleans 沒有提供任何下面的方法。
方法或字段簽名 | 描述 |
int BYTES | 常量:表示該原生類型需要的字節(jié)數(shù) |
prim fromByteArray(byte[] bytes) | 使用字節(jié)數(shù)組的前 Prims.BYTES 個(gè)字節(jié),按大字節(jié)序返回原生類型值;如果 bytes.length <= Prims.BYTES,拋出 IAE |
prim fromBytes(byte b1, …, byte bk) | 接受 Prims.BYTES 個(gè)字節(jié)參數(shù),按大字節(jié)序返回原生類型值 |
byte[] toByteArray(prim value) | 按大字節(jié)序返回 value 的字節(jié)數(shù)組 |
JDK 原生類型包裝類提供了針對(duì)有符號(hào)類型的方法,而 UnsignedInts 和 UnsignedLongs 工具類提供了相應(yīng)的無符號(hào)通用方法。UnsignedInts 和 UnsignedLongs 直接處理原生類型:使用時(shí),由你自己保證只傳入了無符號(hào)類型的值。
此外,對(duì) int 和 long,Guava 提供了無符號(hào)包裝類(UnsignedInteger 和 UnsignedLong),來幫助你以極小的性能消耗,對(duì)有符號(hào)和無符號(hào)類型進(jìn)行強(qiáng)制轉(zhuǎn)換。
JDK 的原生類型包裝類提供了有符號(hào)形式的類似方法。
方法簽名 | 說明 |
int UnsignedInts.parseUnsignedInt(String)long UnsignedLongs.parseUnsignedLong(String) | 按無符號(hào)十進(jìn)制解析字符串 |
int UnsignedInts.parseUnsignedInt(String string, int radix)long UnsignedLongs.parseUnsignedLong(String string, int radix) | 按無符號(hào)的特定進(jìn)制解析字符串 |
String UnsignedInts.toString(int)String UnsignedLongs.toString(long) | 數(shù)字按無符號(hào)十進(jìn)制轉(zhuǎn)為字符串 |
String UnsignedInts.toString(int value, int radix)String UnsignedLongs.toString(long value, int radix) | 數(shù)字按無符號(hào)特定進(jìn)制轉(zhuǎn)為字符串 |
無符號(hào)包裝類包含了若干方法,讓使用和轉(zhuǎn)換更容易。
方法簽名 | 說明 |
UnsignedPrim add(UnsignedPrim), subtract, multiply, divide, remainder | 簡(jiǎn)單算術(shù)運(yùn)算 |
UnsignedPrim valueOf(BigInteger) | 按給定 BigInteger 返回?zé)o符號(hào)對(duì)象,若 BigInteger 為負(fù)或不匹配,拋出 IAE |
UnsignedPrim valueOf(long) | 按給定 long 返回?zé)o符號(hào)對(duì)象,若 long 為負(fù)或不匹配,拋出 IAE |
UnsignedPrim asUnsigned(prim value) | 把給定的值當(dāng)作無符號(hào)類型。例如,UnsignedInteger.asUnsigned(1<<31)的值為 231,盡管 1<<31 當(dāng)作 int 時(shí)是負(fù)的 |
BigInteger bigIntegerValue() | 用 BigInteger 返回該無符號(hào)對(duì)象的值 |
toString(), toString(int radix) | 返回?zé)o符號(hào)值的字符串表示 |
譯者注:UnsignedPrim 指各種無符號(hào)包裝類,如 UnsignedInteger、UnsignedLong。