当前位置: 首页 > news >正文

Java基础——常用API5

一、BigInteger

1.1 简介

如果你想用比这个long的最大值还要大的数,那么long不再适用了,就需要使用到BigInteger。

它只要不是小数就都可以适用,它是有上限的,只不过非常大几乎可以看作无穷。

1.2 构造方法

String val :表示字符串形式的数字,如“1”.

package com.lkbhua.MyApi.BigInteger;import java.math.BigInteger;
import java.util.Random;public class demo1 {public static void main(String[] args) {// 1、获取一个随机的大整数// public BigInteger(int num, Random rnd): 获取随机大整数,范围:[0, 2^num-1]BigInteger bd1 = new BigInteger(4, new Random());System.out.println(bd1); // 0-15for(int i = 0; i < 10; i++){BigInteger bd2 = new BigInteger(4, new Random());System.out.println(bd2);}// 2、获取一个指定的大整数// public BigInteger(String val): 获取指定字符串表示的大整数// 切记:不能写小数、负数、字符BigInteger bd3 = new BigInteger("123456789012345678901234567890");System.out.println(bd3);// 3、获取指定进制的大整数// public BigInteger(byte[] val,int radix): 获取指定进制表示的大整数// 细节:// 1、字符串中的数字必须是整数// 2、字符串中的数字必须要跟进制匹配// 比如规定二进制后,那么""只能写0或者1,写其他的就报错。BigInteger bd4 = new BigInteger("100", 10);BigInteger bd5 = new BigInteger("100", 2);System.out.println(bd4);// 4、静态方法获取BigInteger的对象,内部有优化// 跟2点的区别:// 1、能表示的范围没有第二点的大,只能在long的取值范围之内。// 2、在内部中对常用的数字进行了优化:-16-16//    提前把-16-16先创建好BigInteger对象,如果多次获取不会创建新的。BigInteger bd6 = BigInteger.valueOf(100);System.out.println(bd5);// 验证第二点BigInteger bd7 = BigInteger.valueOf(16);BigInteger bd8 = BigInteger.valueOf(16);System.out.println(bd7 == bd8); // true// 5、对象一旦创建,内部数据就不能发生改变BigInteger bd9 = BigInteger.valueOf(1);BigInteger bd10 = BigInteger.valueOf(2);BigInteger result =  bd9.add(bd10);System.out.println(result);// 此时,结果虽然是3,但是bd9和bd10没有变,而是创建了一个新的对象,保存了结果。}
}


1.3 常见的成员方法

package com.lkbhua.MyApi.BigInteger;import java.math.BigInteger;public class demo2 {public static void main(String[] args) {/*BigInteger的常见成员方法:用以计算BIgInteger存储的数据计算。*/// public BigInteger add(BigInteger val)// 1、创建一个BigInteger对象BigInteger bd1 = BigInteger.valueOf(10);BigInteger bd2 = BigInteger.valueOf(5);BigInteger bd3 = bd1.add(bd2);System.out.println(bd3);// public BigInteger[] divideAndRemainder(BigInteger val)// 2、除法,获取商和余数BigInteger[] arr = bd1.divideAndRemainder(bd2);System.out.println(arr.length);System.out.println(arr[0]); // 商System.out.println(arr[1]); // 余数// public boolean equals(Object obj)// 3、判断两个对象是否相等System.out.println(bd1.equals(bd2));// public BigInteger pow(int exponent)// 4、求幂BigInteger bd4 = bd1.pow(2);System.out.println(bd4);// public BigInteger max/min(BigInteger val)// 5、获取两个对象中的最大值/最小值System.out.println(bd1.max(bd2));System.out.println(bd1.min(bd2));// public int intValue(BigInteger val)// 6、获取int值// 转换的值超过int范围,会抛出异常// 相应的要变更成longValue()、doubleValue()int a = bd1.intValue();int b = bd2.intValue();System.out.println(a + b);}
}


1.4 底层的原理

这个数字已经超过了long的存储数字的最大值,那么BigInteger在底层到底如何存储这个超过的最大数呢?

点击BigInteger,ctrl+b打开查看底层源码

其底层代码中的成员变量有两个:

final int signum:表示记录BigInteger的正负符号。-1,为负数;0就是0;1为正数。

final int[] mag:它存储的就是BigInteger里面的数据。

因为数据太大了,它会对数字进行拆分,会把一个很大数字分成很多的小段。每一个小段会单独的放到数组当中。

比如27670116110564327424,会先把这个数字转换成二进制的补码,从右往左32位为一组,把各自的组别中转换成10进制,把他们按照顺序存储到这个数组当中就可以了。

利用debug运行测试代码,查看能发现

那么我们就可以解释这个BigInteger既然能存储这么大的数字,我们几乎认为是等于无限大,那么这个最大到底能有多大,这个就可以看出,这个最大的数字是这个数组存储的最大长度。而数组中的每一位元素又可以存储一个int类型范围的数字。

现实生活中没有一台电脑的内存能扛住这么大的数字存储的。所以我们认为几乎无限。

声明:

以上均来源于B站@ITheima的教学内容!!!

本人跟着视频内容学习,整理知识引用

http://www.dtcms.com/a/562353.html

相关文章:

  • 网站开发的进度安排电子商务网站开发目的和意义
  • 网站建设和赚钱方法网站后台编辑框无法显示
  • 什么网站可以找人做系统网站建设工作描述
  • 【大模型实战笔记 5】基于Streamlit的多模态AI聊天机器人应用开发实战
  • 彩票网站开发需要多少钱如何做网站免费教程
  • 深圳网站建设企业儿童教育自适应网站模板
  • 网站建设公司织梦模板下载陵水网站建设
  • 中山网站建设哪家好济宁网站建设联系方式
  • 房产采集网站源代码北京网站建设方案外包
  • 中山网站制作方案如何制作一个微信刷题小程序
  • 网站首页改版费用网站的建设及维护
  • 学做花蛤的网站wordpress如何控制内容图片大小
  • 建设网站的傻瓜图文指南注重网站内容维护
  • 如何构造私有的大模型微调数据集
  • 网站源码.net微信官网weixinqqcom
  • 网页设计与网站建设期末考试试卷wordpress背景自动变幻图形
  • 注册网站挣钱wordpress太难用了
  • 怎么发布自己做的网站建设银行官方网站官网
  • 湘潭网站建设开发企业网站网页设计费用
  • 苏宁易购网站建设建议西安优秀的集团门户网站建设服务商
  • 济南网络建站php网站搭建教程
  • CTF密码学学习思路:从入门到进阶
  • 网站关键词做标签做一个企业网站需要哪些技术
  • 新闻门户网站psd模板网站的建设费计入无形资产吗
  • 网站建设如何空间绑定域名广告行业包括网站建设吗
  • 4.2 【2015统考真题】
  • Github学生认证报错Error getting location
  • 网站建设的调研报告网站建设经费计划内容
  • 那个网站可以帮助做数学题搜索营销
  • 百日挑战——单词篇(第十一天)