首页 > 编程语言 >Java之API详解之Biginteger类的详解

Java之API详解之Biginteger类的详解

时间:2023-12-01 23:33:07浏览次数:43  
标签:Biginteger val int BigInteger API println public 详解 out


 6 BigInteger类

6.1 引入

平时在存储整数的时候,Java中默认是int类型,int类型有取值范围:-2147483648 ~ 2147483647。如果数字过大,我们可以使用long类型,但是如果long类型也表示不下怎么办呢?

就需要用到BigInteger,可以理解为:大的整数。

有多大呢?理论上最大到42亿的21亿次方

基本上在内存撑爆之前,都无法达到这个上限。

6.2 概述

查看API文档,我们可以看到API文档中关于BigInteger类的定义如下:

Java之API详解之Biginteger类的详解_System

Java之API详解之Biginteger类的详解_大整数_02编辑

BigInteger所在包是在java.math包下,因此在使用的时候就需要进行导包。我们可以使用BigInteger类进行大整数的计算

6.3 常见方法

构造方法

public BigInteger(int num, Random rnd) 		//获取随机大整数,范围:[0 ~ 2的num次方-1]
public BigInteger(String val) 				//获取指定的大整数
public BigInteger(String val, int radix) 	//获取指定进制的大整数
    
下面这个不是构造,而是一个静态方法获取BigInteger对象
public static BigInteger valueOf(long val) 	//静态方法获取BigInteger的对象,内部有优化

Java之API详解之Biginteger类的详解_静态方法_03

构造方法小结:

  • 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
  • 如果BigInteger表示的超出long的范围,可以用构造方法获取。
  • 对象一旦创建,BigInteger内部记录的值不能发生改变。
  • 只要进行计算都会产生一个新的BigInteger对象

常见成员方法

BigDecimal类中使用最多的还是提供的进行四则运算的方法,如下:

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类型整数,超出范围数据有误

Java之API详解之Biginteger类的详解_静态方法_04

代码实现:

package com.itheima.a06bigintegerdemo;

import java.math.BigInteger;

public class BigIntegerDemo1 {
    public static void main(String[] args) {
        /*
            public BigInteger(int num, Random rnd) 获取随机大整数,范围:[0~ 2的num次方-11
            public BigInteger(String val) 获取指定的大整数
            public BigInteger(String val, int radix) 获取指定进制的大整数

            public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化

            细节:
            对象一旦创建里面的数据不能发生改变。
        */


        //1.获取一个随机的大整数
        /* Random r=new Random();
            for (int i = e; i < 100; i++) {
            BigInteger bd1 = new BigInteger(4,r);
            System.out.println(bd1);//[@ ~ 15]}
            }
        */

        //2.获取一个指定的大整数,可以超出long的取值范围
        //细节:字符串中必须是整数,否则会报错
        /* BigInteger bd2 = new BigInteger("1.1");
            System.out.println(bd2);
        */

        /*
            BigInteger bd3 = new BigInteger("abc");
            System.out.println(bd3);
         */

        //3.获取指定进制的大整数
        //细节:
        //1.字符串中的数字必须是整数
        //2.字符串中的数字必须要跟进制吻合。
        //比如二进制中,那么只能写日和1,写其他的就报错。
        BigInteger bd4 = new BigInteger("123", 2);
        System.out.println(bd4);

        //4.静态方法获取BigInteger的对象,内部有优化
        //细节:
        //1.能表示范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了。
        //2.在内部对常用的数字: -16 ~ 16 进行了优化。
        //  提前把-16~16 先创建好BigInteger的对象,如果多次获取不会重新创建新的。
        BigInteger bd5 = BigInteger.valueOf(16);
        BigInteger bd6 = BigInteger.valueOf(16);
        System.out.println(bd5 == bd6);//true


        BigInteger bd7 = BigInteger.valueOf(17);
        BigInteger bd8 = BigInteger.valueOf(17);
        System.out.println(bd7 == bd8);//false


        //5.对象一旦创建内部的数据不能发生改变
        BigInteger bd9 =BigInteger.valueOf(1);
        BigInteger bd10 =BigInteger.valueOf(2);
        //此时,不会修改参与计算的BigInteger对象中的借,而是产生了一个新的BigInteger对象记录
        BigInteger result=bd9.add(bd10);
        System.out.println(result);//3

    }
}

Java之API详解之Biginteger类的详解_System_05

package com.itheima.a06bigintegerdemo;

import java.math.BigInteger;

public class BigIntegerDemo2 {
    public static void main(String[] args) {
        /*
            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.创建两个BigInteger对象
        BigInteger bd1 = BigInteger.valueOf(10);
        BigInteger bd2 = BigInteger.valueOf(5);

        //2.加法
        BigInteger bd3 = bd1.add(bd2);
        System.out.println(bd3);

        //3.除法,获取商和余数
        BigInteger[] arr = bd1.divideAndRemainder(bd2);
        System.out.println(arr[0]);
        System.out.println(arr[1]);

        //4.比较是否相同
        boolean result = bd1.equals(bd2);
        System.out.println(result);

        //5.次幂
        BigInteger bd4 = bd1.pow(2);
        System.out.println(bd4);

        //6.max
        BigInteger bd5 = bd1.max(bd2);


        //7.转为int类型整数,超出范围数据有误
        /* BigInteger bd6 = BigInteger.valueOf(2147483647L);
         int i = bd6.intValue();
         System.out.println(i);
         */

        BigInteger bd6 = BigInteger.valueOf(200);
        double v = bd6.doubleValue();
        System.out.println(v);//200.0
    }
}

Java之API详解之Biginteger类的详解_静态方法_06

6.4 底层存储方式:

对于计算机而言,其实是没有数据类型的概念的,都是0101010101,数据类型是编程语言自己规定的,所以在实际存储的时候,先把具体的数字变成二进制,每32个bit为一组,存储在数组中。

数组中最多能存储元素个数:21亿多

数组中每一位能表示的数字:42亿多

理论上,BigInteger能表示的最大数字为:42亿的21亿次方。

但是还没到这个数字,电脑的内存就会撑爆,所以一般认为BigInteger是无限的。

存储方式如图所示:

Java之API详解之Biginteger类的详解_大整数_07

Java之API详解之Biginteger类的详解_System_08编辑



标签:Biginteger,val,int,BigInteger,API,println,public,详解,out
From: https://blog.51cto.com/u_16265376/8649570

相关文章

  • java BigInteger
    packagenet.elaina.BigIntegerTest;importjava.math.BigInteger;importjava.util.Random;publicclasstest1{publicstaticvoidmain(String[]args){/*publicBigInteger(intnum,Randomrnd)获取随机大整数,范围:[e~2的num次方......
  • Java集合框架详解
    Java集合框架是什么?Java中的集合框架指的是一组接口、类和算法,用于存储和操作一组对象。这些对象可以是基本类型、自定义类型或其他Java对象集合框架提供了更加高效、灵活和功能丰富的数据结构,而不限于数组或其他简单的数据结构。通过使用Java的集合框架,可以大大提高代码的可......
  • Java设计模式-策略模式详解
    1.策略模式基本了解策略模式(StrategyPattern)是一种行为型设计模式,它定义了一组可以相互替换的算法,使得客户端可以根据不同的需求选择不同的算法,将对象和行为分开。在策略模式中,我们创建了一个策略接口,该接口定义了所有必需的方法。然后,我们创建了实现了该策略接口的具体策略......
  • 【STM32F103】HC-SR04超声波测距模块详解(附工程文件)
    前言:使用的硬件:STM32F103C8T6,HC-SR04,ST-Link(其他烧录器也可以),0.96寸OLED屏幕(非必须,仅供显示测距结果,可以使用串口助手代替),若干杜邦线。涉及操作stm32的GPIO口,外部中断,定时器,本文中不会详细解释,仅提供代码思路。HC-SR04:HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。......
  • 虚拟机安装详解
    虚拟机安装 1.选择虚拟机软件
在安装虚拟机之前,需要选择一款合适的虚拟机软件。目前市面上有很多虚拟机软件供选择,如VMware、VirtualBox等。根据你的需求和操作系统的支持情况,选择合适的虚拟机软件。2.下载操作系统镜像文件
购买虚拟主机空间后,你会得到一个操作系统镜像文件......
  • .NET Core|--调用C++库|--docker环境下让web api应用程序调用C++类库
    前言#前提安装docker环境~启动docker~#多说一句,为什么我要搞这个一个镜像,既包含gcc开发环境,又包含.NET开发环境我的api应用程序是基于.NET写的,但是我的这个api程序,又要调用c++的一些东西,特别是涉及一些画图之类的,所以就需要gcc的开发环境,最终搞了这么一......
  • 详解十大经典排序算法(一):冒泡排序
    算法原理冒泡排序通过多次遍历数组,比较相邻元素并交换,逐步将最大值(或最小值)"冒泡"到数组的一端。算法描述冒泡排序是一种简单的排序算法,它重复地遍历待排序的元素,比较相邻的两个元素,并根据需要交换它们的位置,直到整个序列排序完成。冒泡排序的基本思想是通过相邻元素的比较和交换,将......
  • 「盘点」界面控件DevExtreme UI v23.1中的API增强
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,到ASP.NETCore或Vue,DevExtreme包含全面的高性能和响应式UI小部件集合,可在传统Web和下一代移动应用程序中......
  • 使用Unity Localization插件进行项目本地化实战详解
    在使用Unity开发游戏的过程中,本地化是必不可少的。网络上也有很多的本地化工具,本次我介绍的是Unity官方提供的Localization插件,大家可以在PackageManager进行安装 一、语言配置,本地化表创建在ProjectSetting中找到Localization,(需要先创建这个LocalizationSetting文件)点击L......
  • 学习笔记3:JavaSE & API(异常处理)
    1、Java中的错误(1)所有错误的超类:Throwable(2)Throwable的子类:子类:Error,系统级别错误、运行环境错误。比如,虚拟机内存溢出。子类:Exception,异常情况,通常是逻辑问题导致的程序级别错误,可在运行期间被解决。比如,空指针,下标越界。(3)通常,程序中处理的异常都是Exception。(4)错误输出:S......