【Java常用类】1-6 BigInteger 类
§1-6 BigInteger
类
1-6.1 使用 BigInteger
类
BigInteger
常常用于解决超出基本类型上限的整型数据问题。它也位于 java.math
包下,继承自 Number
。
构造方法:
构造方法 | 描述 |
---|---|
BigInteger(String val) |
将 BigInteger 的十进制字符串表示形式转换为 BigInteger 。推荐使用此方法。 |
BigInteger(int numBits, Random rnd) |
构造一个随机生成的 BigInteger ,均匀分布在 0 到 (\(2^{\text{numBits}} - 1\)), 包括在内。 |
BigInteger(String val, int radix) |
将指定基数中 BigInteger 的字符串表示形式转换为 BigInteger 。 |
静态方法:
静态方法 | 描述 |
---|---|
static BigInteger valueOf(long val) |
返回一个 BigInteger ,其值等于指定的 long 的值。 |
使用建议:
- 一般而言,对于所创建的整型大小不确定,优先选择
BigInteger(String val)
方法创建对象; - 当所创建的对象数值坐落于
long
类型的范围,数值不大且确定,可使用静态的valueOf()
方法; - 同
Integer
类类似,BigInteger
类也有 “缓冲区”。调用valueOf()
方法时,若传入的参数范围位于 \([-16, 16]\) ,则返回已经创建好的对象,否则则在堆中新建对象;
由于不再属于基本数据类型,只能够通过使用内置方法进行计算。
常用方法:
方法 | 描述 |
---|---|
BigInteger abs() |
返回该 BigInteger 的绝对值。 |
BigInteger add(BigInteger val) |
加法 |
BigInteger subtract(BigInteger val) |
减法 |
BigInteger multiply(BigInteger val) |
乘法 |
BigInteger divide(BigInteger val) |
除法,返回商 |
BigInteger divideAndRemainder(BigInteger val) |
返回数组,含有商和余数 |
BigInteger remainder(BigInteder val) |
返回余数 |
BigInteger negate() |
返回相反数 |
BigInteger pow(int exponent) |
返回幂 |
BigInteger sqrt() |
返回整数平方根 |
BigInteger mod(BigInteger m) |
求模 |
BigInteger max/min(BigInteger val) |
返回最值 |
int intValue() |
返回该 BigInteger 的 int 转换 |
int intValueExact() |
返回该 BigInteger 的 int 转换,并检查丢失信息 |
boolean equals() |
判断二者数值是否相等 |
int compareTo() |
判断二者数值是否相等,大于返回 1 ,等于返回 0 ,小于返回 -1 |
注意:
int intValue()
方法在转换过程中,若BigInteger
太大而无法放入int
中,则仅返回低位 32 位。此转换可能会丢失有关BigInteger
整体大小的信息,并返回一个带有相反符号的结果。同样地,类似的情况也会发生在doubleValue()
,longValue()
方法中,对于double
,若量级太大而无法表示,则会根据需要转换为double_NEGATIVE_INFINITY
或double_POSITIVE_INFINITY
;int intValueExact()
方法在转换过程中,若转换超出范围,无法放入int
中,则抛出异常ArithmeticException
。类似地,相同的情况也会发生在byteValueExact()
,longValueExact()
等方法中;- 返回最值时,方法不会创建新的对象,而是返回符合要求的对象。
1-6.2 注意事项
- 对象创建好后,其值不可被改变;
- 注意创建对象时,传入参数必须合法:字符串不可包含非法字符,传入整型必须符合进制要求;
- 同
BigDecimal
,只要进行了计算,都会产生一个新的BigInteger
对象; BigInteger
也支持一些基本的数学运算:四则运算、幂运算、整数平方根、绝对值、相反数、求余数、求模运算、最值、最大公约数等。注意,返回结果均为BigInteger
,即全为整型;
1-6.3 底层原理
在计算机中,所有的数据都是以一串串的 0 和 1 表示,数据类型是由编程语言决定的。
BigInteger
存储数据的原理如下:
以数字 27679116119564327424
为例
-
将传入的数字使用二进制补码表示;
本例,转换后得到
1_100000000000000000000000000000000000_000000000000000000000000000000000000
; -
将该补码以 32 位(
int
表示范围)为一组,拆开后各自转成十进制;转换后得到数组
1, -2147483648, 0
; -
将数组保存在成员数组
mag
中,并用int signum
记录数字符号;注:
signum == -1
为负数,signum == 0
为零,signum == 1
为正数。
而数组的最大长度为 int
上限(约为 21 亿),数组元素都为 int
,每一个元素能表示的数字约为 42 亿个,则 BigInteger
所能存储的理论最大数字约为 \((4.2 \times 10^{8})^{2.1 \times 10^{8}}\) 。因此可认为,BigInteger
所能表示的最大数接近无限。