早期的编程语言为了节约计算机的内存, 给数字变量定义了各种存储规格的数值类型, 比如字节型 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);
总结一下, 包装数字类型相比基本数字类型, 表达的数值范围并没有扩大, 仅仅是调用方式上有所区别, 可谓是换汤不换药. 而大数字类型真正解决了数值范围的表达限制, 并且完全取消了带有明显数学印记的算术运算符, 这才形成了面向方法而非面向运算的编程风格.
来源: http://www.bubuko.com/infodetail-2860476.html