Primitives:JDK未提供对基本类型(如int
和char
)的操作,包括某些类型的无符号变体。
1.概述
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
工具中,因为字节的有符号性比其他类型的有符号性更含糊。
在UnsignedInts
和UnsignedLongs
类中提供了int
和long
方法的无符号变体,但是由于这些类型的大多数用法都是有符号的,因此Ints
和Longs
类将其输入视为有符号的。
此外,Guava为无符号的int
和long
值提供了“包装器类型”UnsignedInteger
和UnsignedLong
,以帮助你使用类型系统在有符号和无符号值之间进行强制区分,以换取较低的性能成本。这些类直接支持BigInteger
样式的简单算术运算。
所有方法签名都使用Wrapper
引用相应的JDK包装器类型,并使用prim
引用原生类型。(Prims
,在适用的情况下是指相应的Guava工具类。)
2.原生数组工具
原生数组是聚合处理原生类型的最有效方法(在内存和性能方面)。 Guava提供了多种工具来使用这些方法。
方法签名 | 描述 | 类似集合 | 可用性 |
---|---|---|---|
ListasList(prim...backingArray) | 将原生数组包装为相应包装器类型的List。 | Arrays.asList | 符号无关* |
prim[]toArray(Collectioncollection) | 将集合复制到新的prim[]中。此方法与collection.toArray()一样是线程安全的。 | Collection.toArray() | 符号无关 |
prim[]concat(prim[]...arrays) | 连接多个原生数组。 | Iterables.concat | 符号无关 |
booleancontains(prim[]array,primtarget) | 确定指定的元素是否在指定的数组中。 | Collection.contains | 符号无关 |
intindexOf(prim[]array,primtarget) | 查找array中target值首次出现的索引,如果不存在该值,则返回-1。 | List.indexOf | 符号无关 |
intlastIndexOf(prim[]array,primtarget) | 查找array中target值最后一次出现的索引,如果不存在该值,则返回-1。 | List.lastIndexOf | 符号无关 |
primmin(prim...array) | 返回数组的最小元素。 | Collections.min | 符号相关** |
primmax(prim...array) | 返回数组的最大元素。 | Collections.max | 符号相关 |
Stringjoin(Stringseparator,prim...array) | 构造一个包含array元素的字符串,用separator分隔。 | Joiner.on(separator).join | 符号相关 |
ComparatorlexicographicalComparator() | 按字典顺序比较原生数组的比较器。 | 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
。
3.通用工具方法
Guava提供了许多JDK 6都不包含的基本工具。然而,其中一些方法在JDK 7中可用。
方法签名 | 描述 | 可用性 |
---|---|---|
intcompare(prima,primb) | 在原生类型上使用传统的Comparator.compare方法。从JDK7开始在JDK包装器类中提供。 | 符号相关 |
primcheckedCast(longvalue) | 将指定的值强制转换为prim,除非指定的值不符合prim,在这种情况下将抛出IllegalArgumentException。 | 仅与符号有关的整数类型* |
primsaturatedCast(longvalue) | 将指定的值强制转换为prim,除非指定的值不符合prim,在这种情况下使用最接近的prim值。 | 仅与符号有关的整数类型 |
*
这里的整数类型包括byte
,short
,int
,long
。整数类型不包括char
,boolean
,float
或double
。
注意 :com.google.common.math.DoubleMath
提供了从double
四舍五入的功能,并且支持多种四舍五入模式。有关详细信息,请参见MathExplained 。
4.字节转换方法
Guava提供了按 大字节序顺序 将原生类型与字节数组表示形式相互转换的方法。除了布尔值不提供这些方法外,所有方法均与符号无关。
方法签名 | 描述 |
---|---|
intBYTES | 表示prim值所需的字节数的常量表示。 |
primfromByteArray(byte[]bytes) | 返回大字节序表示的bytes数组中第一个Prims.BYTES字节的prim值。如果bytes.length<=Prims.BYTES则抛出IllegalArgumentException。 |
primfromBytes(byteb1,...,bytebk) | 采用Prims.BYTES字节参数。返回prim值,其字节表示为按大字节序顺序指定的字节。 |
byte[]toByteArray(primvalue) | 返回包含大字节序表示形式的value值的数组。 |
5.无符号支持
UnsignedInts
和UnsignedLongs
工具类提供了Java在其包装类中的签名类型提供的一些通用工具。UnsignedInts
和UnsignedLongs
直接处理原生类型:由你来确保仅将无符号值传递给这些工具。
此外,对于int
和long
而言,Guava提供了“无符号”包装器类型(UnsignedInteger
和UnsignedLong
),以帮助你在类型系统中强制区分无符号和有符号值,以换取较低的性能成本。
5.1通用工具
这些方法的有符号形式类似提供在JDK的包装器类。
方法签名 | 说明 |
---|---|
intUnsignedInts.parseUnsignedInt(String)longUnsignedLongs.parseUnsignedLong(String) | 从以10为基数(进制)的字符串中解析无符号值。 |
intUnsignedInts.parseUnsignedInt(Stringstring,intradix)longUnsignedLongs.parseUnsignedLong(Stringstring,intradix) | 从指定基数(进制)的字符串中解析无符号值。 |
StringUnsignedInts.toString(int)StringUnsignedLongs.toString(long) | 返回以10为基数(进制)的无符号值的字符串表示形式。 |
StringUnsignedInts.toString(intvalue,intradix)StringUnsignedLongs.toString(longvalue,intradix) | 返回指定基数(进制)的无符号值的字符串表示形式。 |
5.2包装器
所提供的无符号包装器类型包括许多方法,以使其更容易使用和转换。
方法签名 | 说明 |
---|---|
UnsignedPrimplus(UnsignedPrim),minus,times,dividedBy,mod | 简单的算术运算。 |
UnsignedPrimvalueOf(BigInteger) | 以UnsignedPrim的形式返回BigInteger的值,如果指定的BigInteger为负数或不匹配,则抛出IAE。 |
UnsignedPrimvalueOf(long) | 以UnsignedPrim的形式返回long的值,如果指定的long为负数或不匹配,则抛出IAE。 |
UnsignedPrimfromPrimBits(primvalue) | 将给定的值视为无符号的。例如,UnsignedInteger.fromIntBits(1<<31)的值为231,即使1<<31作为int是负数。 |
BigIntegerbigIntegerValue() | 以BigInteger的形式获取此UnsignedPrim的值。 |
toString(),toString(intradix) | 返回此无符号值的字符串表示形式。 |