官术网_书友最值得收藏!

4.3.1 大整數BigInteger

早期的編程語言為了節約計算機的內存,給數字變量定義了各種存儲規格的數值類型,比如字節型byte只占用1字節大小,短整型short占用2字節大小,整型int占用4字節大小,長整型long占用8字節大小。但是長整型只能表達到-263~263-1,超出這個范圍的巨大整數竟連long類型也放不下。何況現在無論是手機還是計算機的內存都是以GB計量的,因此原先錙銖計較幾字節的數值類型便不合時宜了。為此,Java又設計了一種大整數類型BigInteger。BigInteger能夠表示任意大小的整數,而不再局限于多少位的數值范圍。

乍看起來,BigInteger仿佛與Integer相似,僅僅在類型開頭添加了Big字樣。事實上,它們的類型設計有頗多異曲同工之處,二者的很多基本方法是一模一樣的,例如初始化賦值的valueOf方法、比較相等的equals方法以及轉換為基本數字類型的幾個方法(包括byteValue、shortValue、intValue、longValue、floatValue、doubleValue等)。當然,BigInteger要處理的可是超大整數,故而它的用法還是與Integer有所區別的。接下來一一介紹BigInteger特別的地方。

首先,介紹如何初始化一個大整數變量。前面介紹Integer的時候,提到Java代碼有3種給包裝變量賦值的方式,分別是使用等號直接賦予具體數字、調用valueOf方法賦值、通過關鍵字new創建指定數字的包裝變量。然而到了大整數BigInteger這里,3種方式只剩下valueOf方法能夠對大整數變量初始化。

其次,包裝變量允許使用“+”“-”“*”“/”“%”等運算符執行四則運算,到了大整數變量這里卻不能使用算術運算符,而要通過專門的計算方法才能開展運算。具體說來,大整數類型使用add方法取代了加法運算符“+”,使用subtract方法取代了減法運算符“-”,使用multiply方法取代了乘法運算符“*”,使用divide方法取代了除法運算符“/”,使用remainder方法取代了取余數運算符“%”,使用negate方法取代了負號運算符“-”。這些新方法的調用代碼示例如下(完整代碼見本章源碼的src\com\method\big\TestInteger.java):

        BigInteger nine=BigInteger.valueOf(9);      //生成一個指定數值的大整數變量
        BigInteger four=BigInteger.valueOf(4);      //生成一個指定數值的大整數變量
        BigInteger sum=nine.add(four);              //add方法用來替代加法運算符“+”
        System.out.println("sum="+sum);
        BigInteger sub=nine.subtract(four);      //subtract方法用來替代減法運算符“-”
        System.out.println("sub="+sub);
        BigInteger mul=nine.multiply(four);      //multiply方法用來替代乘法運算符“*”
        System.out.println("mul="+mul);
        BigInteger div=nine.divide(four);          //divide方法用來替代除法運算符“/”
        System.out.println("div="+div);
        BigInteger remainder=nine.remainder(four);  //remainder方法用來替代取余數運算符“%”
        System.out.println("remainder="+remainder);
        BigInteger neg=nine.negate();              //negate方法用來替代負號運算符“-”
        System.out.println("neg="+neg);

再次,Java雖然提供了常用的數學函數庫Math,但是Math庫只能操作基本數字類型的變量,不能操作大數字類型的變量。因而BigInteger另外提供了abs方法和pow方法,分別用于求大數字變量的絕對值和大數字變量的N次方。下面是大整數類型BigInteger調用這兩個方法的代碼例子:

        BigInteger abs=nine.abs();  // abs方法用來替代數學庫函數Math.abs
        System.out.println("abs="+abs);
        BigInteger pow=nine.pow(2);  // pow方法用來替代數學庫函數Math.pow
        System.out.println("pow="+pow);

總結一下,包裝數字類型相比基本數字類型,表達的數值范圍并沒有擴大,僅僅是調用方式上有所區別,可謂是換湯不換藥。而大數字類型真正解決了數值范圍的表達限制,并且取消了帶有明顯數學印記的算術運算符,這才形成了面向方法而非面向運算的編程風格。

主站蜘蛛池模板: 文登市| 冀州市| 靖边县| 泸定县| 邵武市| 随州市| 宁海县| 白玉县| 宁武县| 抚州市| 永登县| 隆化县| 聊城市| 远安县| 康马县| 奈曼旗| 文昌市| 科尔| 格尔木市| 高平市| 古田县| 亳州市| 松滋市| 盐边县| 翁源县| 马山县| 长垣县| 遂昌县| 银川市| 瓮安县| 竹溪县| 林西县| 安多县| 太康县| 黑山县| 镇安县| 靖安县| 宝鸡市| 会昌县| 甘孜县| 太仆寺旗|