Java BigInteger

245 阅读3分钟

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底层存储方式

Snipaste_2022-10-23_15-06-30.png

  • 先将正负号以-1,0,1的形式存储到signum中
  • 先将数据转换成二进制的补码形式
  • 从右往左32位分为一组
  • 再将每一组转换成各自的十进制
  • 将它们从左往右存储到mag数组当中

BigInteger存储上限

  • 数组的最大长度是int的最大值:2147483647
  • 数组中每一位能表示的数字:-2114183648 ~ 2147483647
  • 数组中最多能储存元素个数:21亿多
  • 数组中每一位能表示的数字:42亿多
  • BigInteger能表示的最大数字为:42亿的21亿次方