[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提供了無符號包裝類(UnsignedInteger和UnsignedLong),來幫助你以極小的性能消耗,對有符號和無符號類型進行強制轉換。
無符號通用工具方法
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-原生類型
from:?http://ifeve.com/google-guava-primitives/
總結
以上是生活随笔為你收集整理的[Google Guava] 7-原生类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java泛型的类型擦除
- 下一篇: [Google Guava] 12-数学