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

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

相关推荐
Edward111111115 小时前
一AI名词
java·开发语言·数据库·学习
栈溢出了5 小时前
Redis repl_backlog 学习笔记
java·开发语言·redis·学习
urkay-6 小时前
Kotlin Flow分类
android·开发语言·kotlin
并不喜欢吃鱼6 小时前
从零开始 C++----- 十五.一文吃透 C++ 异常:try-catch、栈展开、自定义异常、异常安全 noexcept 底层全剖析
java·开发语言·jvm
gr95ZS6E66 小时前
基础入门java安全(一)--CC1基础分析
开发语言·python
智码看视界6 小时前
Day19 Spring Boot启动优化:启动时间从8秒降到2秒
java·spring boot·后端·启动优化
北京阿法龙科技有限公司6 小时前
AR智能眼镜安防应用核心指标:识别距离筑牢防线
java·开发语言·ar
杜子不疼.6 小时前
【C++】继承—C++的秘密武器,get父类的智慧
开发语言·c++
殘殤血6 小时前
Tomcat的事件监听机制:观察者模式 _
java·观察者模式·tomcat
汤姆yu6 小时前
面向具身智能的物理视频模拟器:蚂蚁灵波LingBot-Video开源模型全解析
java·大数据·人工智能·gpt·开源·大模型·音视频