Java基础——常用API5
一、BigInteger
1.1 简介
如果你想用比这个long的最大值还要大的数,那么long不再适用了,就需要使用到BigInteger。


它只要不是小数就都可以适用,它是有上限的,只不过非常大几乎可以看作无穷。
1.2 构造方法
String val :表示字符串形式的数字,如“1”.

package com.lkbhua.MyApi.BigInteger;import java.math.BigInteger;
import java.util.Random;public class demo1 {public static void main(String[] args) {// 1、获取一个随机的大整数// public BigInteger(int num, Random rnd): 获取随机大整数,范围:[0, 2^num-1]BigInteger bd1 = new BigInteger(4, new Random());System.out.println(bd1); // 0-15for(int i = 0; i < 10; i++){BigInteger bd2 = new BigInteger(4, new Random());System.out.println(bd2);}// 2、获取一个指定的大整数// public BigInteger(String val): 获取指定字符串表示的大整数// 切记:不能写小数、负数、字符BigInteger bd3 = new BigInteger("123456789012345678901234567890");System.out.println(bd3);// 3、获取指定进制的大整数// public BigInteger(byte[] val,int radix): 获取指定进制表示的大整数// 细节:// 1、字符串中的数字必须是整数// 2、字符串中的数字必须要跟进制匹配// 比如规定二进制后,那么""只能写0或者1,写其他的就报错。BigInteger bd4 = new BigInteger("100", 10);BigInteger bd5 = new BigInteger("100", 2);System.out.println(bd4);// 4、静态方法获取BigInteger的对象,内部有优化// 跟2点的区别:// 1、能表示的范围没有第二点的大,只能在long的取值范围之内。// 2、在内部中对常用的数字进行了优化:-16-16// 提前把-16-16先创建好BigInteger对象,如果多次获取不会创建新的。BigInteger bd6 = BigInteger.valueOf(100);System.out.println(bd5);// 验证第二点BigInteger bd7 = BigInteger.valueOf(16);BigInteger bd8 = BigInteger.valueOf(16);System.out.println(bd7 == bd8); // true// 5、对象一旦创建,内部数据就不能发生改变BigInteger bd9 = BigInteger.valueOf(1);BigInteger bd10 = BigInteger.valueOf(2);BigInteger result = bd9.add(bd10);System.out.println(result);// 此时,结果虽然是3,但是bd9和bd10没有变,而是创建了一个新的对象,保存了结果。}
}

1.3 常见的成员方法

package com.lkbhua.MyApi.BigInteger;import java.math.BigInteger;public class demo2 {public static void main(String[] args) {/*BigInteger的常见成员方法:用以计算BIgInteger存储的数据计算。*/// public BigInteger add(BigInteger val)// 1、创建一个BigInteger对象BigInteger bd1 = BigInteger.valueOf(10);BigInteger bd2 = BigInteger.valueOf(5);BigInteger bd3 = bd1.add(bd2);System.out.println(bd3);// public BigInteger[] divideAndRemainder(BigInteger val)// 2、除法,获取商和余数BigInteger[] arr = bd1.divideAndRemainder(bd2);System.out.println(arr.length);System.out.println(arr[0]); // 商System.out.println(arr[1]); // 余数// public boolean equals(Object obj)// 3、判断两个对象是否相等System.out.println(bd1.equals(bd2));// public BigInteger pow(int exponent)// 4、求幂BigInteger bd4 = bd1.pow(2);System.out.println(bd4);// public BigInteger max/min(BigInteger val)// 5、获取两个对象中的最大值/最小值System.out.println(bd1.max(bd2));System.out.println(bd1.min(bd2));// public int intValue(BigInteger val)// 6、获取int值// 转换的值超过int范围,会抛出异常// 相应的要变更成longValue()、doubleValue()int a = bd1.intValue();int b = bd2.intValue();System.out.println(a + b);}
}
1.4 底层的原理
这个数字已经超过了long的存储数字的最大值,那么BigInteger在底层到底如何存储这个超过的最大数呢?

点击BigInteger,ctrl+b打开查看底层源码
其底层代码中的成员变量有两个:
final int signum:表示记录BigInteger的正负符号。-1,为负数;0就是0;1为正数。
final int[] mag:它存储的就是BigInteger里面的数据。

因为数据太大了,它会对数字进行拆分,会把一个很大数字分成很多的小段。每一个小段会单独的放到数组当中。

比如27670116110564327424,会先把这个数字转换成二进制的补码,从右往左32位为一组,把各自的组别中转换成10进制,把他们按照顺序存储到这个数组当中就可以了。

利用debug运行测试代码,查看能发现

那么我们就可以解释这个BigInteger既然能存储这么大的数字,我们几乎认为是等于无限大,那么这个最大到底能有多大,这个就可以看出,这个最大的数字是这个数组存储的最大长度。而数组中的每一位元素又可以存储一个int类型范围的数字。

现实生活中没有一台电脑的内存能扛住这么大的数字存储的。所以我们认为几乎无限。


声明:
以上均来源于B站@ITheima的教学内容!!!
本人跟着视频内容学习,整理知识引用
