[Google Guava] 7-原生类型
概述
Java的原生类型就是指基本类型:byte、short、int、long、float、double、char和boolean。
在从Guava查找原生类型方法之前,可以先查查Arrays类,或者对应的基础类型包装类,如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,以帮助你使用类型系统,以极小的性能消耗对有符号和无符号值进行强制转换。
在本章下面描述的方法签名中,我们用Wrapper表示JDK包装类,prim表示原生类型。(Prims表示相应的Guava工具类。)
原生类型数组工具
原生类型数组是处理原生类型集合的最有效方式(从内存和性能双方面考虑)。Guava为此提供了许多工具方法。
| 方法签名 | 描述 | 类似方法 | 可用性 |
| List<Wrapper> asList(prim… backingArray) | 把数组转为相应包装类的List | Arrays.asList | 符号无关* |
| prim[] toArray(Collection<Wrapper> collection) | 把集合拷贝为数组,和collection.toArray()一样线程安全 | Collection.toArray() | 符号无关 |
| prim[] concat(prim[]… arrays) | 串联多个原生类型数组 | Iterables.concat | 符号无关 |
| boolean contains(prim[] array, prim target) | 判断原生类型数组是否包含给定值 | Collection.contains | 符号无关 |
| int indexOf(prim[] array, prim target) | 给定值在数组中首次出现处的索引,若不包含此值返回-1 | List.indexOf | 符号无关 |
| int lastIndexOf(prim[] array, prim target) | 给定值在数组最后出现的索引,若不包含此值返回-1 | List.lastIndexOf | 符号无关 |
| prim min(prim… array) | 数组中最小的值 | Collections.min | 符号相关* |
| prim max(prim… array) | 数组中最大的值 | Collections.max | 符号相关 |
| String join(String separator, prim… array) | 把数组用给定分隔符连接为字符串 | Joiner.on(separator).join | 符号相关 |
| Comparator<prim[]> lexicographicalComparator() | 按字典序比较原生类型数组的Comparator | 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的原生类型包装类也提供这样的方法 | 符号相关 |
| prim checkedCast(long value) | 把给定long值转为某一原生类型,若给定值不符合该原生类型,则抛出IllegalArgumentException | 仅适用于符号相关的整型* |
| prim saturatedCast(long value) | 把给定long值转为某一原生类型,若给定值不符合则使用最接近的原生类型值 | 仅适用于符号相关的整型 |
*这里的整型包括byte, short, int, long。不包括char, boolean, float, 或double。
**译者注:不符合主要是指long值超出prim类型的范围,比如过大的long超出int范围。
注:com.google.common.math.DoubleMath提供了舍入double的方法,支持多种舍入模式。相见第12章的”浮点数运算”。
字节转换方法
Guava提供了若干方法,用来把原生类型按大字节序与字节数组相互转换。所有这些方法都是符号无关的,此外Booleans没有提供任何下面的方法。
| 方法或字段签名 | 描述 |
| int BYTES | 常量:表示该原生类型需要的字节数 |
| prim fromByteArray(byte[] bytes) | 使用字节数组的前Prims.BYTES个字节,按大字节序返回原生类型值;如果bytes.length <= Prims.BYTES,抛出IAE |
| prim fromBytes(byte b1, …, byte bk) | 接受Prims.BYTES个字节参数,按大字节序返回原生类型值 |
| byte[] toByteArray(prim value) | 按大字节序返回value的字节数组 |
无符号支持
JDK原生类型包装类提供了针对有符号类型的方法,而UnsignedInts和UnsignedLongs工具类提供了相应的无符号通用方法。UnsignedInts和UnsignedLongs直接处理原生类型:使用时,由你自己保证只传入了无符号类型的值。
此外,对int和long,Guava提供了无符号包装类(UnsignedInteger和UnsignedLong),来帮助你以极小的性能消耗,对有符号和无符号类型进行强制转换。
无符号通用工具方法
JDK的原生类型包装类提供了有符号形式的类似方法。
无符号包装类
无符号包装类包含了若干方法,让使用和转换更容易。
| 方法签名 | 说明 |
| UnsignedPrim add(UnsignedPrim), subtract, multiply, divide, remainder | 简单算术运算 |
| UnsignedPrim valueOf(BigInteger) | 按给定BigInteger返回无符号对象,若BigInteger为负或不匹配,抛出IAE |
| UnsignedPrim valueOf(long) | 按给定long返回无符号对象,若long为负或不匹配,抛出IAE |
| UnsignedPrim asUnsigned(prim value) | 把给定的值当作无符号类型。例如,UnsignedInteger.asUnsigned(1<<31)的值为231,尽管1<<31当作int时是负的 |
| BigInteger bigIntegerValue() | 用BigInteger返回该无符号对象的值 |
| toString(), toString(int radix) | 返回无符号值的字符串表示 |
译者注:UnsignedPrim指各种无符号包装类,如UnsignedInteger、UnsignedLong。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: [Google Guava] 7-原生类型
[Google Guava] 7-原生类型的更多相关文章
- Google Guava官方教程(中文版)
Google Guava官方教程(中文版) 原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...
- [转载]Google Guava官方教程(中文版)
原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] ...
- Guava学习笔记:Google Guava 类库简介
http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...
- Google Guava之--cache
一.简介 Google Guava包含了Google的Java项目许多依赖的库,如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support ...
- com.google.guava 包解析 ——Google Guava官方教程(中文版)
全网址 http://ifeve.com/google-guava/ 竹子博客: http://www.cnblogs.com/peida/archive/2013/06/08/ ...
- 初探Google Guava
Guava地址:https://github.com/google/guava 第一次接触我是在16年春github上,当时在找单机查缓存方法,google guava当初取名是因为JAVA的类库不好 ...
- Google Guava新手教程
以下资料整理自网络 一.Google Guava入门介绍 引言 Guavaproject包括了若干被Google的 Java项目广泛依赖 的核心库,比如:集合 [collections] . ...
- Google Guava 类库简介
Guava 是一个 Google开发的 基于java的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency librar ...
- 开源介绍:Google Guava、Google Guice、Joda-Time
一.Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency lib ...
随机推荐
- 解决 pycharm [Errno 11001] getaddrinfo failed 错误提示!
我看网上很多问题对这个问题的解决方法也是一只半解的,可能产生问题的原因不一样吧,今天我说下我的经验 解决办法: 原因就是你的本地dns解析的host文件,里面的的解析地址被注释了! 打开本地的hous ...
- MongoDB添加删除节点
副本集添加删除节点 sharding添加删除节点 先将节点设置为hidden,再remove
- go变量的定义并赋值
变量在定义时没有明确的初始化时会赋值为_零值_. 零值是: 数值类型为 `0`, 布尔类型为 `false`, 字符串为 `""`(空字符串). package main impo ...
- Hibernate一对多自关联、多对多关联
今天分享hibernate框架的两个关联关系 多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不 ...
- 03 HttpServletRequest_HttpServletResponse
HttpServletRequest:一次来自客户端的请求的相关信息 请求行 request.getMethod() 获取http请求方式 request.getRequestURI() 获取统一资源 ...
- Android 使用自定义Drawable 设置圆角矩形或者圆形图片
转自 Android Drawable 那些不为人知的高效用法 本文出自:[张鸿洋的博客] http://blog.csdn.net/lmj623565791/article/details/437 ...
- 记录我第一篇用Markdown写的Blog
Markdown的介绍 喝水不忘挖井人-Markdown的创造者 Markdown 最初是由 John Gruber 和 Aaron Swartz 于 2004 年共同设计的(在这里插一句,Aaron ...
- Windows下使用批处理文件.bat删除旧文件
本文教大家写一个批处理文件.bat删除旧文件,供大家参考,具体内容如下 1. 批处理文件 del_old_file.bat rem 删除D:\temp目录下7天前的文件Forfiles /p E:\b ...
- 3d转化
3d转化 想要实现3d效果,首先要确定的是观察点,这是2d转换所不需要的.具体的我也看的很糊涂,美术什么的根本不懂好吗. 但有些东西是确定的,perspective定义的是3d元素距视图的距离,因此像 ...
- angular轮播图
还是直接上代码比较好 <!doctype html><html lang="en"><head> <meta charset=" ...