目录
前言
之前我们学习基本数据类型时,知道 int 的最大值大约是 21 亿,而 long 的最大值大约是 900 亿亿。 听起来很大对吧?但是,如果我们要求 100 的阶乘(100!),或者处理加密算法中动辄几百位的超大数字,long 也会瞬间内存溢出。
当基本数据类型无法满足我们的需求时,Java为我们提供了一个工具类------BigInteger。
一、什么是BigInteger?
BigInteger 位于 java.math 包下。
与int和long这些受限于计算机硬件位数的基本数据类型不同,BigInteger 是一个引用数据类型(对象)。
它在底层实际上是通过动态数组来存储数字的。只要你的电脑内存足够大,它就能存下无限长的数字。
1.BigInteger构造方法
| 方法名 | 说明 |
|---|---|
| public BigInteger(int num, Random rnd) | 获取随机大整数,范围:[0 ~ 2的num次方-1] |
| public BigInteger(String val) | 获取指定的大整数 |
| public BigInteger(String val, int radix) | 获取指定进制的大整数 |
| public static BigInteger valueOf(long val) | 静态方法获取BigInteger的对象,内部有优化 |
注:BigInteger对象一旦创建,内部记录的值不能发生改变
①BigInteger(int num, Random rnd):获取随机大整数,范围:[0 ~ 2的num次方-1]
java
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
BigInteger bd1 = new BigInteger(4, new Random());
System.out.println(bd1);
}
}
}
运行结果:

②BigInteger(String val):获取指定的大整数
java
public class Test {
public static void main(String[] args) {
BigInteger bd2 = new BigInteger("999999999999999999999");
System.out.println(bd2);
}
}
运行结果:

错误范例:
当输入小数时:


注:字符串中必须是整数,否则会报错
③BigInteger(String val, int radix):获取指定进制的大整数
java
public class Test {
public static void main(String[] args) {
BigInteger bd4 = new BigInteger("100", 10);
BigInteger bd5 = new BigInteger("100", 2);
System.out.println(bd4);
System.out.println(bd5);
}
}
运行结果:

注:
1、字符串中的数字必须是整数。
2、字符串中的数字必须要跟进制吻合。
④BigInteger valueOf(long val):静态方法获取BigInteger的对象,内部有优化
基础用法:
java
public class Test {
public static void main(String[] args) {
BigInteger bd1 = BigInteger.valueOf(100);
System.out.println(bd1);
}
}

细节1:该方法表示的范围比较小,只能在long的取值范围内,如果超出了long的范围就会报错。
java
public class Test {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
BigInteger bd1 = BigInteger.valueOf(9223372036854775807L);
System.out.println(bd1);
}
}

但是

细节2:该方法对常用的数字进行了优化,-16 ~ +16,提前把-16 ~ +16创建好BigInteger的对象,如果多次获取不会创建新的。
java
public class Test {
public static void main(String[] args) {
BigInteger bd1 = BigInteger.valueOf(16);
BigInteger bd2 = BigInteger.valueOf(16);
BigInteger bd3 = BigInteger.valueOf(17);
BigInteger bd4 = BigInteger.valueOf(17);
System.out.println(bd1 == bd2);
System.out.println(bd3 == bd4);
}
}
运行结果:

2.构造方法总结
- 如果BigInteger表示的数字没有超出long的范围,可以使用静态方法获取。
- 如果BigInteger表示的超出long的范围,可以用构造方法获取。
- 对象一旦创建,BigInteger内部记录的值不能发生改变。
- 只要进行计算都会产生一个新的BigInteger对象。
二、BigInteger常见成员方法
| 方法名 | 说明 |
|---|---|
| public BigInteger add(BigInteger val) | 加法 |
| public BigInteger subtract(BigInteger val) | 减法 |
| public BigInteger multiply(BigInteger val) | 乘法 |
| public BigInteger divide(BigInteger val) | 除法,获取商 |
| public BigInteger[] divideAndRemainder(BigInteger val) | 除法,获取商和余数 |
| public boolean equals(object x) | 比较是否相同 |
| public BigInteger pow(int exponent) | 次幂 |
| public BigInteger max/min(BigInteger val) | 返回较大值/较小值 |
| public int intValue(BigInteger val) | 转为int类型整数 |
1.加减乘除
java
public class MathDemo {
public static void main(String[] args) {
BigInteger a = new BigInteger("10000000000000000000");
BigInteger b = new BigInteger("20000000000000000000");
// 加法 (Add)
BigInteger sum = a.add(b);
System.out.println("加法结果:" + sum);
// 减法 (Subtract)
BigInteger sub = a.subtract(b);
// 乘法 (Multiply)
BigInteger mul = a.multiply(b);
// 除法 (Divide) - 注意:如果是除不尽的,它会像 int 一样直接舍弃小数部分
BigInteger div = b.divide(a);
}
}

2.divideAndRemainder
java
public class Test {
public static void main(String[] args) {
BigInteger a = new BigInteger("10000000000000000002");
BigInteger b = new BigInteger("20000000000000000000");
BigInteger[] c = b.divideAndRemainder(a);
for (int i = 0; i < 2; i++) {
System.out.println(c[i]);
}
}
}
运行结果:

3.equals
java
public class Test {
public static void main(String[] args) {
BigInteger a = new BigInteger("10000000000000000002");
BigInteger b = new BigInteger("20000000000000000000");
boolean result = a.equals(b);
System.out.println(result);
}
}
运行结果:

总结
-
遇到超大数字,优先使用
new BigInteger("字符串")。 -
使用
add、subtract、multiply、divide。 -
计算结果必须重新赋值,因为它不可变