鍍金池/ 教程/ Java/ 原生類型
不可變集合
排序: Guava 強(qiáng)大的”流暢風(fēng)格比較器”
強(qiáng)大的集合工具類:java.util.Collections 中未包含的集合工具
新集合類型
常見 Object 方法
I/O
前置條件
字符串處理:分割,連接,填充
散列
原生類型
數(shù)學(xué)運(yùn)算
使用和避免 null
Throwables:簡(jiǎn)化異常和錯(cuò)誤的傳播與檢查
google Guava 包的 ListenableFuture 解析
事件總線
緩存
函數(shù)式編程
區(qū)間
集合擴(kuò)展工具類
Google-Guava Concurrent 包里的 Service 框架淺析
google Guava 包的 reflection 解析

原生類型

概述

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ù)組工具

原生類型數(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)算”。

字節(jié)轉(zhuǎ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ù)組

無符號(hào)支持

JDK 原生類型包裝類提供了針對(duì)有符號(hào)類型的方法,而 UnsignedInts 和 UnsignedLongs 工具類提供了相應(yīng)的無符號(hào)通用方法。UnsignedInts 和 UnsignedLongs 直接處理原生類型:使用時(shí),由你自己保證只傳入了無符號(hào)類型的值。

此外,對(duì) int 和 long,Guava 提供了無符號(hào)包裝類(UnsignedIntegerUnsignedLong),來幫助你以極小的性能消耗,對(duì)有符號(hào)和無符號(hào)類型進(jìn)行強(qiáng)制轉(zhuǎn)換。

無符號(hào)通用工具方法

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)包裝類

無符號(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。

上一篇:新集合類型下一篇:散列