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

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

相关推荐
卷毛的技术笔记几秒前
双十一零点扛过10倍流量洪峰:Sentinel与Redis+Lua的分布式限流深度避坑指南
java·redis·分布式·后端·系统架构·sentinel·lua
minji...几秒前
Linux 网络基础之UDP协议(四)传输层协议 UDP,再谈端口号,UDP 特点
linux·服务器·开发语言·网络·c++·tcp/ip·udp
逻辑驱动的ken几秒前
Java高频面试考点场景题27
java·开发语言·面试·职场和发展·求职招聘
清水白石0085 分钟前
从手写初始化到 pytest fixture:让 Python 测试既干净、可复用,又能驾驭异步并发
开发语言·python·pytest
不知名的老吴10 分钟前
关于C++中new的基本使用方法介绍
开发语言·c++
在角落发呆11 分钟前
c socket 服务器转发,c socket 服务器转发的方法
服务器·c语言·开发语言
yujunl13 分钟前
U9一种客开方案的解决
开发语言
wjs202413 分钟前
Python pass 语句详解
开发语言
专注VB编程开发20年14 分钟前
专业分析python底层调用与按键精灵,ah3等的对比,hookdll,内存加载,调用.net dll
开发语言·javascript·python·microsoft·php·.net
时间不早了sss14 分钟前
Python处理文档
开发语言·前端·python