1. 程式人生 > >[Google Guava] 7-原生型別

[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提供了無符號包裝類(UnsignedIntegerUnsignedLong),來幫助你以極小的效能消耗,對有符號和無符號型別進行強制轉換。

無符號通用工具方法

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