大整数复制

问题描述 投票:0回答:6

也许我真的很困惑,因为这似乎是一个非常简单的问题,但是谷歌和官方文档还不够。

我想复制一个 BigInteger,但找不到干净的方法。

BigInteger a = b
b
是一个 BigInteger 时,因为 BigInteger 是一个对象并且这里没有运算符重载,
a
引用与
b

相同的对象

到目前为止我发现的最干净的方式是

BigInteger a = b.add(BigInteger.ZERO)
,但对我来说仍然是一种肮脏的方式。

java biginteger
6个回答
15
投票

BigInteger
是不可变的——永远不需要复制
BigInteger
.


14
投票

BigInteger
与其他包装类(例如
Integer
String
)一样是不可变的。所以不用担心可能的更改/篡改。

P.S:作为奖励,这里有一个关于何时需要防御性复制的链接。

http://www.javapractices.com/topic/TopicAction.do?Id=15


7
投票

你可以使用

BigInteger(String val)

BigInteger first = new BigInteger("15");
BigInteger second = new BigInteger(first.toString());

尽管这是可能的,

BigInteger
对象是 immutable 并且我无法想象需要复制。


3
投票

首先,您不需要复制

BigInteger
因为它是不可变的类。 (复制
BigInteger
与复制
String
一样有用......)

但是如果您确实需要复制一个,那么更有效的方法是:

BigInteger first = new BigInteger(42);
BigInteger second = first.add(BigInteger.ZERO);

这避免了(相对)昂贵的二进制 -> 十进制 -> 二进制转换和中间字符串的创建。

而且

BigInteger.clone()
应该更有效率......


1
投票

怎么样:

BigInteger a = b.clone()

但如前所述,它是不可变的,因此应该没有必要。


0
投票

不变性不能解决这个问题: 假设你想写一个相当于

的循环
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());

(如前所述,例如

https://stackoverflow.com/a/31208304/21446284

© www.soinside.com 2019 - 2024. All rights reserved.