BigInteger
在Java中,整数有四种类型:byte,short,int,long
在底层占用字节个数:byte1个字节,short2个字节,int4个字节,long8个字节
BigInteger非常非常大,可以看作无限大
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 var) | 静态方法获取BigInteger的对象,内部有优化 |
-
public BigInteger(String val)细节
- 字符串中必须是整数,否则会报错
-
public BigInteger(String val, int radix)细节
- 字符串中必须是整数,否则会报错
- 字符串中的数字必须要跟进制吻合
- 比如二进制中,只能写0和1,写其他的会报错
-
Public static BigInteger valueOf(long var)细节
- 能表示范围比较小,在long的取值范围之内,如果超出long的范围就不行了
- 在内部对常用的数字:-16 ~ 16 进行了优化
- 提前把-16 ~ 16 先创建好BigInteger的对象,如果多次获取不会重新创建新的
public static final int MAX_CONSTANT = 16;
//静态常量ZERO表示0对应的BigInteger对象
public static final BigInteger ZERO = new BigInteger(new int[0], 0);
//静态代码块
static {
//通过循环的方式创建-16 ~ 16(不包括0)的BigInteger对象
for (int i = 1; i <= MAX_CONSTANT; i++) {
int[] magnitude = new int[i];
magnitude[0] = 1;
//储存正数对象的数组
posConst[i] = new BigInteger(magnitude, 1);
//储存负数对象的数组
negConst[i] = new BigInteger(magnitude, -1);
}
}
public static BigInteger valueOf(long val) {
//先进行判断,如果创建的对象属于[-16, 16]
//直接返回已经在内部创建好的对象
//如果不属于[-16, 16]
//再调用BigInteger(String val)创建对象
if (val = 0)
return ZERO;
if (val > 0 && val <= MAX_CONSTANT)
return posConst[(int) val];
else if (val < 0 && val >= -MAX_CONSTANT)
return negConst[(int) -val];
return new BigInteger(val);
}
- 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(BigInteger val) | 返回较大值(对象) |
| public BigInteger min(BigInteger val) | 返回较小值(对象) |
| public int intValue(BigInteger val) | 转为int类型整数,超出范围数据有误 |
| public int longValue(BigInteger val) | 转为long类型整数,超出范围数据有误 |
| public int doubleValue(BigInteger val) | 转为double类型小数,超出范围数据有误 |
BigInteger底层存储方式
- 对于计算机而言,其实是没有数据类型的概念的,都是01010101
- 数据类型是编程语言自己规定的
在BigInteger中定义了两个成员变量
final int signum;
final int[] mag;
- signum
- 记录BigInteger的正负号
- 如果signum记录的是-1,说明是负数;如果是0,说明是0;如果是1,说明是正数
- mag[]
- 记录的是BigInteger里面的数据
- 因为BigInteger里面的数据太大了,所以会将其进行拆分,会将一个很大的数拆成很多个小段,每一个小段都会放到数组当中
BigInteger底层存储方式
- 先将正负号以-1,0,1的形式存储到signum中
- 先将数据转换成二进制的补码形式
- 从右往左32位分为一组
- 再将每一组转换成各自的十进制
- 将它们从左往右存储到mag数组当中
BigInteger存储上限
- 数组的最大长度是int的最大值:2147483647
- 数组中每一位能表示的数字:-2114183648 ~ 2147483647
- 数组中最多能储存元素个数:21亿多
- 数组中每一位能表示的数字:42亿多
- BigInteger能表示的最大数字为:42亿的21亿次方