是否存在用于无符号数字类型包装器的Java库?

Luk*_*der 31 java unsigned numbers

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

所有这些肤浅描述它是如何能做到.但是它有什么实际图书馆去所有的方式和实施适当的包装UByte,UShort,UInteger,ULong?优选地,那些包装器将延伸java.lang.Number并提供类似于其的算术API java.math.BigInteger.

从本文档中可以看出,有很多需要考虑的问题,以及可能出错的问题(例如,如何按位移位,如何乘法等),所以我不想自己做.此外,我不想只使用下一个更高的类型(例如,Short而不是Byte等).我想的概念8-bit,16-bit,32-bit,64-bit号码保留,与数据库提供最好的交互,例如.

更新:

在你回答之前!考虑一下我知道所有的解决方法,但我真的很想拥有具有上述属性的4种类型.也许有人已经这样做了,所以这就是我问的原因.无需提醒我解决方法.

Luk*_*der 28

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

http://github.com/jOOQ/jOOU

据我所知,有些人可能认为这是矫枉过正,但我真的很想有恰恰是那些包装包装什么其他语言调用ubyte,ushort,uint,ulong.希望与Valhalla一起,这些包装可以变成价值类型.

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


A.H*_*.H. 20

有些原因导致没有人按照您想要的方式创建这些包装器.

  • 性能
  • 垃圾收集器开销
  • 没有自动装箱/拆箱
  • 糟糕/无用的界面.
  • 存在更简单的处理方法

前面四点由一个小C示例说明:

unsigned int x=42, y, m=5, t=18;
y = x * m + t;
Run Code Online (Sandbox Code Playgroud)

这将被翻译成:

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

UInteger y = x.multiplyBy(m);
y = y.add(t);
Run Code Online (Sandbox Code Playgroud)

必须创建几个包装器对象,multiplyBy并add生成更多.如果以这种方式进行许多计算,这将给垃圾收集器带来相当大的负担.包装和展开也会耗尽你的CPU.

即便是简单的算术也是PITA的写入或读取也很明显.

出于同样的原因,NOBODY使用签名的包装器类型进行算术运算.

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

long x=42, y, m=5, t=18
y = (x*m + t) & 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我同意,当二进制协议使用无符号的64位整数时,它只会变得"丑陋"..你好BigInteger :( (2认同)