Google Guava与原生类型操作相关的类

Primitives:JDK未提供对基本类型(如intchar)的操作,包括某些类型的无符号变体。

1.概述

Java的原生类型是基本类型:byteshortintlongfloatdoublecharboolean

在搜索Guava中的方法之前,你应该检查它是在Arrays数组中还是在对应的JDK包装器类型中,例如Integer

这些原生类型不能用作对象或泛型类型的类型参数,这意味着许多通用工具不能应用于它们。Guava提供了许多这样的通用工具,原生数组与集合API之间的接口方式、从类型到字节数组表示的转换以及对某些类型的无符号行为的支持。

原生类型Guava工具(都在com.google.common.primitives包)
byteBytes, SignedBytes, UnsignedBytes
shortShorts
intInts, UnsignedInteger, UnsignedInts
longLongs, UnsignedLong, UnsignedLongs
floatFloats
doubleDoubles
charChars
booleanBooleans

对于有符号和无符号字节的行为不同的方法在Bytes中被完全跳过,但仅存在于SignedBytesUnsignedBytes工具中,因为字节的有符号性比其他类型的有符号性更含糊。

UnsignedIntsUnsignedLongs类中提供了intlong方法的无符号变体,但是由于这些类型的大多数用法都是有符号的,因此IntsLongs类将其输入视为有符号的。

此外,Guava为无符号的intlong值提供了“包装器类型”UnsignedIntegerUnsignedLong,以帮助你使用类型系统在有符号和无符号值之间进行强制区分,以换取较低的性能成本。这些类直接支持BigInteger样式的简单算术运算。

所有方法签名都使用Wrapper引用相应的JDK包装器类型,并使用prim引用原生类型。(Prims,在适用的情况下是指相应的Guava工具类。)

2.原生数组工具

原生数组是聚合处理原生类型的最有效方法(在内存和性能方面)。 Guava提供了多种工具来使用这些方法。

方法签名描述类似集合可用性
List asList(prim... backingArray)将原生数组包装为相应包装器类型的ListArrays.asList符号无关*
prim[] toArray(Collection 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)查找arraytarget值首次出现的索引,如果不存在该值,则返回-1List.indexOf符号无关
int lastIndexOf(prim[] array, prim target)查找arraytarget值最后一次出现的索引,如果不存在该值,则返回-1List.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 lexicographicalComparator()按字典顺序比较原生数组的比较器。Ordering.natural().lexicographical()符号相关

*与符号无关的方法存在于:BytesShortsIntsLongsFloatsDoublesCharsBooleans。不包括UnsignedIntsUnsignedLongsSignedBytesUnsignedBytes

**与符号相关的方法存在于: SignedBytesUnsignedBytesShortsIntsLongsFloatsDoublesCharsBooleansUnsignedIntsUnsignedLongs。不包括Bytes

3.通用工具方法

Guava提供了许多JDK 6都不包含的基本工具。然而,其中一些方法在JDK 7中可用。

方法签名描述可用性
int compare(prim a, prim b)在原生类型上使用传统的Comparator.compare方法。从JDK 7开始在JDK包装器类中提供。符号相关
prim checkedCast(long value)将指定的值强制转换为prim,除非指定的值不符合prim,在这种情况下将抛出IllegalArgumentException仅与符号有关的整数类型*
prim saturatedCast(long value)将指定的值强制转换为prim,除非指定的值不符合prim,在这种情况下使用最接近的prim值。仅与符号有关的整数类型

*这里的整数类型包括byteshortintlong。整数类型不包括charbooleanfloatdouble

注意com.google.common.math.DoubleMath提供了从double四舍五入的功能,并且支持多种四舍五入模式。有关详细信息,请参见MathExplained

4.字节转换方法

Guava提供了按大字节序顺序将原生类型与字节数组表示形式相互转换的方法。除了布尔值不提供这些方法外,所有方法均与符号无关。

方法签名描述
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值的数组。

5.无符号支持

UnsignedIntsUnsignedLongs工具类提供了Java在其包装类中的签名类型提供的一些通用工具。UnsignedIntsUnsignedLongs直接处理原生类型:由你来确保仅将无符号值传递给这些工具。

此外,对于intlong而言,Guava提供了“无符号”包装器类型(UnsignedIntegerUnsignedLong),以帮助你在类型系统中强制区分无符号和有符号值,以换取较低的性能成本。

5.1通用工具

这些方法的有符号形式类似提供在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)返回指定基数(进制)的无符号值的字符串表示形式。

5.2包装器

所提供的无符号包装器类型包括许多方法,以使其更容易使用和转换。

方法签名说明
UnsignedPrim plus(UnsignedPrim), minus, times, dividedBy, mod简单的算术运算。
UnsignedPrim valueOf(BigInteger)UnsignedPrim的形式返回BigInteger的值,如果指定的BigInteger为负数或不匹配,则抛出IAE
UnsignedPrim valueOf(long)UnsignedPrim的形式返回long的值,如果指定的long为负数或不匹配,则抛出IAE
UnsignedPrim fromPrimBits(prim value)将给定的值视为无符号的。例如,UnsignedInteger.fromIntBits(1 << 31)的值为231,即使1 << 31作为int是负数。
BigInteger bigIntegerValue()BigInteger的形式获取此UnsignedPrim的值。
toString(), toString(int radix)返回此无符号值的字符串表示形式。

本文参考:
PrimitivesExplained
guava-tests-primitives

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值