也许我真的很困惑,因为这似乎是一个非常简单的问题,但是谷歌和官方文档还不够。
我想复制一个 BigInteger,但找不到干净的方法。
BigInteger a = b
当 b
是一个 BigInteger 时,因为 BigInteger 是一个对象并且这里没有运算符重载,a
引用与 b
相同的对象
到目前为止我发现的最干净的方式是
BigInteger a = b.add(BigInteger.ZERO)
,但对我来说仍然是一种肮脏的方式。
BigInteger
是不可变的——永远不需要复制 BigInteger
.
BigInteger
与其他包装类(例如 Integer
和 String
)一样是不可变的。所以不用担心可能的更改/篡改。
P.S:作为奖励,这里有一个关于何时需要防御性复制的链接。
BigInteger(String val)
BigInteger first = new BigInteger("15");
BigInteger second = new BigInteger(first.toString());
尽管这是可能的,
BigInteger
对象是 immutable 并且我无法想象需要复制。
首先,您不需要复制
BigInteger
因为它是不可变的类。 (复制BigInteger
与复制String
一样有用......)
但是如果您确实需要复制一个,那么更有效的方法是:
BigInteger first = new BigInteger(42);
BigInteger second = first.add(BigInteger.ZERO);
这避免了(相对)昂贵的二进制 -> 十进制 -> 二进制转换和中间字符串的创建。
而且
BigInteger.clone()
应该更有效率......
怎么样:
BigInteger a = b.clone()
但如前所述,它是不可变的,因此应该没有必要。
不变性不能解决这个问题: 假设你想写一个相当于
的循环int a = 10;
for(int i = a; i < 10; i++){...}
使用 BigIntegers。 稍后将需要 a 中的初始值:
BigInteger a = new BigInteger(10);
for(BigInteger i = a.copy(); a.compare(BigInteger.TEN) < 0; i = i.plus(BigInteger.ONE)
{...}
循环变量 i 的初始化将需要一个(不存在的)复制操作, 因为否则 i 和 a 将指向同一个对象和值 一旦 i 在循环中增加,in a 就会丢失。
我对进行复制的有效方法的最佳猜测是像
BigInteger i = new BigInteger(a.getByteArray());
(如前所述,例如