【从零开始学Java | 第十八篇】BigInteger

目录

前言

一、什么是BigInteger?

1.BigInteger构造方法

2.构造方法总结

二、BigInteger常见成员方法

1.加减乘除

2.divideAndRemainder

3.equals

总结


前言

之前我们学习基本数据类型时,知道 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.构造方法总结

  1. 如果BigInteger表示的数字没有超出long的范围,可以使用静态方法获取。
  2. 如果BigInteger表示的超出long的范围,可以用构造方法获取。
  3. 对象一旦创建,BigInteger内部记录的值不能发生改变
  4. 只要进行计算都会产生一个新的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("字符串")

  • 使用 addsubtractmultiplydivide

  • 计算结果必须重新赋值,因为它不可变

相关推荐
宵时待雨2 小时前
C++笔记归纳14:AVL树
开发语言·数据结构·c++·笔记·算法
sky wide2 小时前
[特殊字符] Docker Swarm 集群搭建指南
java·docker·容器
wuqingshun3141592 小时前
谈谈你对springAop动态代理的理解?
java·jvm
执笔画流年呀2 小时前
PriorityQueue(堆)续集
java·开发语言
山川行2 小时前
关于《项目C语言》专栏的总结
c语言·开发语言·数据结构·vscode·python·算法·visual studio code
呜喵王阿尔萨斯2 小时前
C and C++ code
c语言·开发语言·c++
武超杰2 小时前
Spring Boot入门教程
java·spring boot·后端
左左右右左右摇晃2 小时前
JDK 1.7 ConcurrentHashMap——分段锁
java·开发语言·笔记
是小蟹呀^2 小时前
Java抽象类详解:从入门到精通
java·抽象类