[Google Guava] 7-原生類型

杜老師說 2022-01-07 13:53:13 阅读数:625

google guava 7- 原生

原文鏈接 譯文鏈接 譯者:沈義揚,校對:丁一

概述

Java的原生類型就是指基本類型:byte、short、int、long、float、double、char和boolean。

在從Guava查找原生類型方法之前,可以先查查Arrays類,或者對應的基礎類型包裝類,如Integer

原生類型不能當作對象或泛型的類型參數使用,這意味著許多通用方法都不能應用於它們。Guava提供了若幹通用工具,包括原生類型數組與集合API的交互,原生類型和字節數組的相互轉換,以及對某些原生類型的無符號形式的支持。

原生類型 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工具類沒有定義任何區分有符號和無符號字節的方法,而是把它們都放到了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 Arrays.asList 符號無關*
prim[] toArray(Collection<Wrapper> collection) 把集合拷貝為數組,和collection.toArray()一樣線程安全 Collection.toArray() 符號無關
prim[] concat(prim[]… arrays) 串聯多個原生類型數組 Iterables.concat 符號無關
boolean contains(prim[] array, prim target) 判斷原生類型數組是否包含給定值 Collection.contains 符號無關
int indexOf(prim[] array, prim target) 給定值在數組中首次出現處的索引,若不包含此值返回-1 List.indexOf 符號無關
int lastIndexOf(prim[] array, prim target) 給定值在數組最後出現的索引,若不包含此值返回-1 List.lastIndexOf 符號無關
prim min(prim… array) 數組中最小的值 Collections.min 符號相關*
prim max(prim… array) 數組中最大的值 Collections.max 符號相關
String join(String separator, prim… array) 把數組用給定分隔符連接為字符串 Joiner.on(separator).join 符號相關
Comparator<prim[]>   lexicographicalComparator() 按字典序比較原生類型數組的Comparator Ordering.natural().lexicographical() 符號相關

*符號無關方法存在於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的原生類型包裝類提供了有符號形式的類似方法。

方法簽名 說明
int UnsignedInts.parseUnsignedInt(String)long UnsignedLongs.parseUnsignedLong(String) 按無符號十進制解析字符串
int UnsignedInts.parseUnsignedInt(String string, int radix)long UnsignedLongs.parseUnsignedLong(String string, int radix) 按無符號的特定進制解析字符串
String UnsignedInts.toString(int)String UnsignedLongs.toString(long) 數字按無符號十進制轉為字符串
String UnsignedInts.toString(int   value, int radix)String UnsignedLongs.toString(long value, int radix) 數字按無符號特定進制轉為字符串

無符號包裝類

無符號包裝類包含了若幹方法,讓使用和轉換更容易。

方法簽名 說明
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

原創文章,轉載請注明: 轉載自並發編程網 – ifeve.com本文鏈接地址: [Google Guava] 7-原生類型

FavoriteLoading添加本文到我的收藏
版权声明:本文为[杜老師說]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071353133428.html