是否有用于无符号数字类型包装器的 Java 库?[已关闭]

2022-09-01 09:36:07

显然,Java本身不支持无符号数字类型,这不会很快改变(从2002年开始的评论)。但是,在使用数据库(如MySQL)时,它们可能会不时派上用场。有很多问题涉及如何模拟无符号数。例如:

他们都肤浅地描述了如何做到这一点。但是有没有一个库实际上一直走来,为,实现合适的包装器?最好是,这些包装器将扩展并提供类似于 的算术 API。UByteUShortUIntegerULongjava.lang.Numberjava.math.BigInteger

本文档中可以看出,有很多事情需要考虑,而且有很多可能出错的地方(例如,如何按位移位,如何乘法等),所以我不想自己做。另外,我不想只使用下一个更高的类型(例如 而不是 等)。例如,我希望保留, , , 数字的概念,以便与数据库进行最佳交互。ShortByte8-bit16-bit32-bit64-bit

更新

在你回答之前!考虑到我知道所有的解决方法,但我真的非常希望拥有恰好具有上述属性的这4种类型。也许有人已经这样做了,所以这就是为什么我问。无需提醒我解决方法。


答案 1

当我在jOOQ中需要这个功能时,我还没有找到类似的东西,所以我推出了我自己的开源库,我称之为jOOU(U代表Unsigned):

http://github.com/jOOQ/jOOU

我知道有些人可能认为这有点过分了,但我真的希望那些包装器准确地包装其他语言所说的,,。希望通过Valhalla,这些包装器可以变成价值类型。ubyteushortuintulong

当然,非常欢迎对算术/按位运算实现的贡献!


答案 2

有一些原因可以解释为什么没有人以您想要的方式创建这些包装器。

  • 性能
  • 垃圾回收器开销
  • 无自动装箱/取消装箱
  • 坏/无用的界面。
  • 存在更简单的处理方法

前四点由一个小的 C 示例演示:

unsigned int x=42, y, m=5, t=18;
y = x * m + t;

这将转化为:

UInteger m = new UInteger(5);
UInteger t = new UInteger(18);
UInteger x = new UInteger(42);

UInteger y = x.multiplyBy(m);
y = y.add(t);

必须创建多个包装器对象,并且将生成更多包装器对象。如果以这种方式进行许多计算,这将给垃圾回收器带来相当大的负担。包装和拆包也会无偿吞噬您的CPU。multiplyByadd

即使是简单的算术也是写或读的PITA,这也是显而易见的。

出于同样的原因,没有人使用有符号包装器类型进行算术运算。

如果您使用下一个更大的有符号类型进行计算并像这样切断上半部分,则所有这些都是不必要的:

long x=42, y, m=5, t=18
y = (x*m + t) & 0xFFFFFFFF;

Java和数据库之间的传输也可以使用下一个最大的签名类型来完成。由于 JDBC 不会创建这些无符号包装器类型,因此您必须自己执行此操作,然后才能将数据转换为无符号包装器。

我自己做了一些CPU密集型数据处理,并处理了二进制协议。在这些场合,我希望我也有未签名的数据类型。但是,在Java中使用包装器类型模拟它们比每次都直接处理问题更成问题。