原生类型
概览
Java的原生类型是基本类型:
byte
short
int
long
float
double
char
boolean
Guava查找方法之前,你应该看一下它是否是Arrays
或者对应的JDK封装类型,例如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
,来帮助你使用类型系统强制区分有符号值和无符号值,以换取小的性能代价。这些类直接支持以BigInteger
的风格的简单的算术操作。
所有方法签名使用Wrapper
来引用对应的JDK封装类型,并且prim
来引用原生类型。(Prims
,如果适用的话,引用对应的Guava实用工具类。)
原生数组工具
原生数组是以聚合方式处理原生类型最高效的方式(在内存和性能方面)。Guava提供大量工具来处理这些方法。
签名 | 描述 | 集合类似方法 | 可用性 |
---|---|---|---|
List<Wrapper> asList(prim... backingArray) | 封装一个原生数组作为对应封装类型的List | Arrays.asList | 符号无关* |
prim[] toArray(Collection<Wrapper> collection) | 复制一个集合到一个新的prim[] 。这个方法和collection.toArray() 一样,是线程安全的 | Collection.toArray() | 符号无关的 |
prim[] concat(prim[]... arrays) | 连接几个原生数组 | Iterables.concat | 符号无关的 |
boolean contains(prim[] array, prim target) | 确定指定的元素是否在指定的数组中 | Collection.contains | 符号无关的 |
int indexOf(prim[] array, prim target) | 发现在array 中第一个出现值target 的索引,如果没有这样的值存在则返回-1 | List.indexOf | 符号无关的 |
int lastIndexOf(prim[] array, prim target) | 发现在array 中最后一个出现值target 的索引,如果没有这样的值存在则返回-1 | List.lastIndexOf | 符号无关的 |
prim min(prim... array) | 返回数组中的最小元素 | Collections.min | 符号相关** |
prim max(prim... array) | 返回数组中的最大元素 | Collections.max | 符号相关 |
String join(String separator, prim... array) | 构造一个包含array 元素的字符串 ,以separator 分隔 | Joiner.on(separator).join | 符号相关 |
Comparator<prim[]> lexicographicalComparator() | 以字典顺序比较原生数组的比较器 | 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开始在JDK封装类提供 | 签名有关 |
prim checkedCast(long value) | 转换指定的值为prim ,除非指定的值不适合prim ,此情况将抛出IllegalArgumentException | 仅对整型类型签名相关* |
prim saturatedCast(long value) | 转换指定的值为prim ,除非指定的值不适合prim ,此情况使用最接近的prim |
*
这里整型类型包含tyte
,short
,int
,long
。整型类型不包含char
,boolean
,float
和double
。
注意:从double
凑整(Rounding)在com.google.common.math.DoubleMath
提供,并且支持大量凑整模式。详情请查看此章节。
字节转换方法
Guava提供将原生类型转换为以大端排序字节数组表示的方法。所有方法是符号无关的,除了Booleans
没有提供这些方法。
签名 | 描述 |
---|---|
int BYTES | 常量,表示代表一个prim 值需要的字节数量 |
prim fromByteArray(byte[] bytes) | 返回在数组bytes 中大端表示法前Prims.BYTES 字节的prim 值。如果bytes.length <= Prims.BYTES 抛出IllegalArgumentException |
prim fromBytes(byte b1, ..., byte bk) | 使用Prims.BYTES 字节参数。按照大端序返回其字节表示是指定的字节的prim 值 |
byte[] toByteArray(prim value) | 返回一个数组,包含value 大端序字节表示 |
无符号的支持
UnsignedInts
和UnsignedLongs
工具类提供了Java在其包装类中为带符号类型提供的一些通用工具。UnsignedInts
和UnsignedLongs
直接处理原生类型:你需要确保无符号值传入这些工具。
除此之外,对于int
和long
,Guava提供“无符号”封装类型:UnsignedInteger
和UnsignedLong
,用来帮助你在类型系统中强制区分无符号和带符号的值,以换取小的性能损失。
通用工具
这些方法的带符号类似方法在JDK中的封装类中提供。
签名 | 说明 |
---|---|
int UnsignedInts.parseUnsignedInt(String) long UnsignedLongs.parseUnsignedLong(String) | 按照10进制将字符串转为无符号值 |
int UnsignedInts.parseUnsignedInt(String string, int radix) long UnsignedLongs.parseUnsignedLong(String string, int radix) | 以指定的进制将字符串转换为无符号值 |
String UnsignedInts.toString(int) String UnsignedLongs.toString(long) | 以10进制返回无符号值的字符串表示 |
String UnsignedInts.toString(int value, int radix) String UnsignedLongs.toString(long value, int radix) | 以指定的进制返回无符号值的字符串表示 |
封装器
提供的无符号封装器类型包含多个方法,使他们的使用和转换更容易。
签名 | 说明 |
---|---|
UnsignedPrim plus(UnsignedPrim) ,minus ,times ,dividedBy ,mod | 简单的运算操作 |
UnsignedPrim valueOf(BigInteger) | 返回一个将BigInteger 当做UnsignedPrim 的值,如果指定的BigInteger 是负数或者不符合则抛出IAE |
UnsignedPrim valueOf(long) | 返回将long 当做UnsignedPrim 的值,如果指定的long 是负数或者不合适,则抛出IAE |
UnsignedPrim fromPrimBits(prim value) | 将给定的值以无符号展示。例如,UnsignedInteger.fromIntBits(1 << 31) 有值232 ,尽管1 << 31 作为int 是负数。 |
BigInteger bigIntegerValue() | 得到UnsignedPrim 作为BigInteger 的值 |
toString() ,toString(int radix) | 返回无符号值的字符串表示 |