【从零开始学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

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

相关推荐
阿拉斯攀登几秒前
20 个 Android JNI + CMake 生产级示例
android·java·开发语言·人工智能·机器学习·无人售货柜
!停4 分钟前
C++入门STL容器string使用基础
开发语言·c++
m0_716765235 分钟前
数据结构--栈的插入、删除、查找详解
开发语言·数据结构·c++·经验分享·学习·青少年编程·visual studio
qq_12084093715 分钟前
Three.js 模型加载与线上稳定性实战:路径、跨域、缓存与降级全链路指南
开发语言·javascript·缓存·vue3
米啦啦.6 分钟前
多态性、虚函数
开发语言·c++·算法·多态·抽象类·纯虚函数
小江的记录本6 分钟前
【 AI工程化】AI工程化:MLOps、大模型全生命周期管理、大模型安全(幻觉、Prompt注入、数据泄露、合规)
java·人工智能·后端·python·机器学习·ai·架构
kernelcraft8 分钟前
Matlab读取CSV数据并处理:从入门到实战的完整指南
开发语言·其他·matlab
我登哥MVP9 分钟前
【SpringMVC笔记】 - 5 - View
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
XMYX-09 分钟前
14 - Go 结构体(struct):从基础到高级实战
开发语言·golang
毅炼12 分钟前
MyBatis 常见问题总结
java·数据库·sql·mybatis