网站首页 > 文章精选 正文
Guava 提供了对无符号数的支持,这对于需要处理无符号整数的场景非常有用,因为 Java 本身并不直接支持无符号整数类型。Guava 中通过 UnsignedInteger 和 UnsignedLong 类来实现对无符号 int 和 long 类型的支持。这两个类位于 com.google.common.primitives 包中。
主要特点
- UnsignedInteger: 这个类提供了对无符号 int 类型的支持。封装了一个 int 值,并且提供了一系列方法来操作这个无符号值,比如加法、减法、乘法、除法等。
- UnsignedLong: 同样,这个类提供了对无符号 long 类型的支持。封装了一个 long 值,并且提供了类似的操作方法。
API说明
创建 UnsignedInteger 或 UnsignedLong:
- 可以使用 fromIntBits(int bits) 方法创建一个 UnsignedInteger 实例,或使用 fromLongBits(long bits) 方法创建 UnsignedLong 实例。
执行算术运算:
- 这些类提供了加法(plus)、减法(minus)、乘法(times)和除法(dividedBy)等方法来进行基本的算术运算。
比较:
- 可以使用 compareTo 方法来比较两个无符号数值。
转换:
- 可以将无符号整数转换为字符串表示形式,或者从字符串转换回无符号整数对象。
使用示例
- 将一个有符号的 int 值视为无符号值进行操作,可以使用 UnsignedInteger :
import com.google.common.primitives.UnsignedInteger;
UnsignedInteger unsignedInt = UnsignedInteger.fromIntBits(0xFFFFFFFF); // 将int的最大值视为无符号数
System.out.println(unsignedInt); // 输出:4294967295
- 无符号数的基本操作
package org.example;
import com.google.common.primitives.UnsignedInteger;
public class UnsignedExample {
public static void main(String[] args) {
// 创建两个UnsignedInteger实例,分别代表两个无符号整数值
UnsignedInteger packetSize1 = UnsignedInteger.fromIntBits(0xFFFFFFFE); // 4294967294
UnsignedInteger packetSize2 = UnsignedInteger.valueOf("255"); // 从字符串创建
// 打印原始值
System.out.println("Packet Size 1: " + packetSize1);
System.out.println("Packet Size 2: " + packetSize2);
// 执行加法操作
UnsignedInteger totalSize = packetSize1.plus(packetSize2);
System.out.println("Total Size (after addition): " + totalSize);
// 比较两个无符号整数
if (packetSize1.compareTo(packetSize2) > 0) {
System.out.println("Packet Size 1 is larger than Packet Size 2.");
} else {
System.out.println("Packet Size 1 is not larger than Packet Size 2.");
}
// 将无符号整数转换为int类型(注意这可能导致溢出)
int maxSizeAsInt = packetSize1.bigIntegerValue().intValue();
System.out.println("Packet Size 1 as int: " + maxSizeAsInt);
}
}
执行结果
Packet Size 1: 4294967294
Packet Size 2: 255
Total Size (after addition): 253
Packet Size 1 is larger than Packet Size 2.
Packet Size 1 as int: -2
说明
计算结果有溢出。原因是:Guava 的 UnsignedInteger 使用一个有符号的 int 类型来存储无符号整数。在逻辑上将 int 的 32 位当作无符号处理,但在进行加法等运算时,如果结果超过了 int 能表示的最大范围(即超过 Integer.MAX_VALUE),就会发生 溢出(overflow)。
建议
要做 大范围的无符号整数运算,建议使用:
BigInteger
或者确保数值不会超过 Integer.MAX_VALUE(即 2,147,483,647),否则很容易出现这种“看似合理却溢出”的错误。
注意事项
尽管 Guava 提供了这样的支持,但在设计系统时还是要考虑原始数据类型的限制和适用范围。
猜你喜欢
- 2025-06-28 java 9新特性 模块化系统(java新版本新特性)
- 2025-06-28 JAVA大集群下的负载均衡之道(java负载均衡是什么意思)
- 2025-06-28 Java Lambda表达式详解(java的lambada表达式)
- 2025-06-28 Java 中的 volatile 关键字(java volatile 例子)
- 2025-06-28 java ArrayList类详解及Vector类简介
- 2025-06-28 Java对比学习Pyton之高级特性:函数式编程
- 2025-06-28 Java面试必备八股文(java面试必备八股文案例)
- 2025-06-28 仓颉、Java、Golang性能测试——数组扩容
- 2025-06-28 怎么求第K大的数,topK 问题(快排的应用)java
- 2025-06-28 轻松掌握 Java 变量:编程世界的存储小能手
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)