【从零开始学Java | 第十八篇】BigInteger
目录前言一、什么是BigInteger1.BigInteger构造方法2.构造方法总结二、BigInteger常见成员方法1.加减乘除2.divideAndRemainder3.equals总结前言之前我们学习基本数据类型时知道int的最大值大约是 21 亿而long的最大值大约是 900 亿亿。 听起来很大对吧但是如果我们要求 100 的阶乘100!或者处理加密算法中动辄几百位的超大数字long也会瞬间内存溢出。当基本数据类型无法满足我们的需求时Java为我们提供了一个工具类——BigInteger。一、什么是BigIntegerBigInteger位于java.math包下。与int和long这些受限于计算机硬件位数的基本数据类型不同BigInteger是一个引用数据类型对象。它在底层实际上是通过动态数组来存储数字的。只要你的电脑内存足够大它就能存下无限长的数字。1.BigInteger构造方法方法名说明publicBigInteger(int num, Random rnd)获取随机大整数范围[0 ~ 2的num次方-1]publicBigInteger(String val)获取指定的大整数publicBigInteger(String val, int radix)获取指定进制的大整数public staticBigInteger valueOf(long val)静态方法获取BigInteger的对象内部有优化注BigInteger对象一旦创建内部记录的值不能发生改变①BigInteger(int num, Random rnd)获取随机大整数范围[0 ~ 2的num次方-1]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)获取指定的大整数public class Test { public static void main(String[] args) { BigInteger bd2 new BigInteger(999999999999999999999); System.out.println(bd2); } }运行结果错误范例当输入小数时注字符串中必须是整数否则会报错③BigInteger(String val, int radix)获取指定进制的大整数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的对象内部有优化基础用法public class Test { public static void main(String[] args) { BigInteger bd1 BigInteger.valueOf(100); System.out.println(bd1); } }细节1该方法表示的范围比较小只能在long的取值范围内如果超出了long的范围就会报错。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的对象如果多次获取不会创建新的。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 BigIntegeradd(BigInteger val)加法public BigIntegersubtract(BigInteger val)减法public BigIntegermultiply(BigInteger val)乘法public BigIntegerdivide(BigInteger val)除法获取商public BigInteger[]divideAndRemainder(BigInteger val)除法获取商和余数public booleanequals(object x)比较是否相同public BigIntegerpow(int exponent)次幂public BigIntegermax/min(BigInteger val)返回较大值/较小值public intintValue(BigInteger val)转为int类型整数1.加减乘除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.divideAndRemainderpublic 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.equalspublic 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。计算结果必须重新赋值因为它不可变