2023-08-17
原文作者:LifeIsForSharing 原文地址:https://solang.blog.csdn.net/article/details/105101316

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

1.概述

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

在搜索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中被完全跳过,但仅存在于SignedBytesUnsignedBytes工具中,因为字节的有符号性比其他类型的有符号性更含糊。

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

此外,Guava为无符号的intlong值提供了“包装器类型”UnsignedIntegerUnsignedLong,以帮助你使用类型系统在有符号和无符号值之间进行强制区分,以换取较低的性能成本。这些类直接支持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() 符号相关

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

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

3.通用工具方法

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

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

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

注意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.无符号支持

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

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

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) 返回此无符号值的字符串表示形式。

本文参考:
PrimitivesExplained
guava-tests-primitives

阅读全文