早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字节大小。但是长整型也只能表达到负2的63次方~2的63次方-1,超出这个范围的巨大整数,竟连long类型也放不下。何况现在不管手机还是电脑的内存都是以GB计量,因此原先锱铢计较几个字节的数值类型便不合时宜了。为此Java又设计了一种大整数类型BigInteger,这个BigInteger能够表示任意大小的整数,而不再局限于多少位的数值范围。
乍看起来,BigInteger仿佛与Integer似曾相识,仅仅在类型开头添加了“Big”字样。事实上它俩个的类型设计有颇多异曲同工之处,二者的很多基本方法就是一模一样,例如初始化赋值的valueOf方法、比较相等的equals方法,以及转换为基本数字类型的几个方法(包括byteValue、shortValue、intValue、longValue、floatValue、doubleValue等)。当然BigInteger要处理的可是超大整数,故而它的用法还是与Integer有所区别的,接下来一一介绍BigInteger特别的地方。
首先是如何对一个大整数变量进行初始化,前面介绍Integer的时候,提到Java代码有三种给包装变量赋值的方式,分别是使用等号直接赋给具体数字、调用valueOf方法进行赋值、通过关键字new创建指定数字的包装变量。然而到了大整数BigInteger这里,三种方式只剩下valueOf方法能够对大整数变量初始化。
其次,包装变量允许使用“+”、“-”、“*”、“/”、“%”等运算符进行四则运算,到了大整数变量这里却不能使用算术运算符,而要通过专门的计算方法才能开展运算。具体说来,大整数类型使用add方法取代了加法运算符“+”,使用subtract方法取代了减法运算符“-”,使用multiply方法取代了乘法运算符“*”,使用divide方法取代了除法运算符“/”,使用remainder方法取代了取余数运算符“%”,使用negate方法取代了负号运算符“-”,这些新方法的调用代码示例如下:

		// 生成一个指定数值的大整数变量
BigInteger nine = BigInteger.valueOf(9);
BigInteger four = BigInteger.valueOf(4);
// add方法用来替代加法运算符“+”
BigInteger sum = nine.add(four);
System.out.println("sum="+sum);
// subtract方法用来替代减法运算符“-”
BigInteger sub = nine.subtract(four);
System.out.println("sub="+sub);
// multiply方法用来替代乘法运算符“*”
BigInteger mul = nine.multiply(four);
System.out.println("mul="+mul);
// divide方法用来替代除法运算符“/”
BigInteger div = nine.divide(four);
System.out.println("div="+div);
// remainder方法用来替代取余数运算符“%”
BigInteger remainder = nine.remainder(four);
System.out.println("remainder="+remainder);
// negate方法用来替代负号运算符“-”
BigInteger neg = nine.negate();
System.out.println("neg="+neg);

再次,Java虽然提供了常用的数学函数库Math,但是Math库只能操作基本数字类型的变量,不能操作大数字类型的变量。因而BigInteger另外提供了abs方法和pow方法,分别用于求大数字变量的绝对值,以及求大数字变量的N次方。下面是大整数类型BigInteger调用这两个方法的代码例子:

		// abs方法用来替代数学库函数Math.abs
BigInteger abs = nine.abs();
System.out.println("abs="+abs);
// pow方法用来替代数学库函数Math.pow
BigInteger pow = nine.pow(2);
System.out.println("pow="+pow);

总结一下,包装数字类型相比基本数字类型,表达的数值范围并没有扩大,仅仅是调用方式上有所区别,可谓是换汤不换药。而大数字类型真正解决了数值范围的表达限制,并且完全取消了带有明显数学印记的算术运算符,这才形成了面向方法而非面向运算的编程风格。

更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(二十九)大整数BigInteger的更多相关文章

  1. Java开发笔记(十九)规律变化的for循环

    前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...

  2. Java学习笔记二十九:一个Java面向对象的小练习

    一个Java面向对象的小练习 一:项目需求与解决思路: 学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性: 1.人类 ...

  3. Java开发学习(二十九)----Maven依赖传递、可选依赖、排除依赖解析

    现在的项目一般是拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用<dependency>标签来进行jar包的引入即可. <depende ...

  4. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  5. Java开发笔记(九十九)定时器与定时任务

    前面介绍了线程的几种运行方式,不管哪种方式,一旦调用了线程实例的start方法,都会立即启动线程的事务处理.然而某些业务场景在事务执行时间方面有特殊需求,例如期望延迟若干时间之后才开始事务运行,又如期 ...

  6. Java开发学习(二十二)----Spring事务属性、事务传播行为

    一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...

  7. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  8. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  9. Java开发学习(二十八)----拦截器(Interceptor)详细解析

    一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...

  10. Java从零开始学二十九(大数操作(BigIntger、BigDecimal)

    一.BigInteger 如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作. 不可变的任意精度的整数.所有操作中 ...

随机推荐

  1. 关于js的页面高度和滚动条高度还有元素高度

    window.innerHeight    这是浏览器里面内容的高度,直接就是值,不需要其它操作; window.pageYOffset 这是滚动条到浏览器顶端的距离; $(元素).offset(). ...

  2. Kubernetes — 我的第一个容器化应用

    而在这篇文章中,我们就来扮演一个应用开发者的角色,使用这个 Kubernetes 集群发布第一个容器化应用. 在开始实践之前,我先给你讲解一下 Kubernetes 里面与开发者关系最密切的几个概念. ...

  3. Java笔试题:给定一个ReadOnlyClass的对象roc,能否把这个对象的age值改成30?

    在Java笔试面试中,经常会遇到代码题,今天我们就来看一则Java代码笔试题. 有如下代码: Class ReadOnlyClass { private Integer age=20; public ...

  4. [Swift]LeetCode170.两数之和III - 数据结构设计 $ Two Sum III - Data structure design

    Design and implement a TwoSum class. It should support the following operations:add and find. add - ...

  5. [Swift]LeetCode448. 找到所有数组中消失的数字 | Find All Numbers Disappeared in an Array

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  6. [Swift]LeetCode949. 给定数字能组成的最大时间 | Largest Time for Given Digits

    Given an array of 4 digits, return the largest 24 hour time that can be made. The smallest 24 hour t ...

  7. Hecher学生互助平台(团队项目第一次)

    团队项目作业链接:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2978 一.团队简介 团队名称:Suc ...

  8. React 中的key值

    在react中必须要有key值,key不是用来提升react的性能的,react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key p ...

  9. 剖析项目多个logback配置(上)

    来源:http://www.cnblogs.com/guozp/p/5949744.html 以下两个是我在使用slf4j + logback时候日志提示的问题,问题不大,都是WARN,并不真正影响运 ...

  10. Swagger2 添加HTTP head参数

    大家使用swagger往往会和JWT一起使用,而一般使用jwt会将token放在head里,这样我们在使用swagger测试的时候并不方便,因为跨域问题它默认不能自定义head参数.然后自己去网上找, ...