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) | 返回此无符号值的字符串表示形式。 |
本文参考:
PrimitivesExplained
guava-tests-primitives
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。