Java源碼分析01_Integer

該類繼承 Number(抽象類)實現Comparable<Integer>接口,它的修飾關鍵字有final,即不能被繼承和修改。大多方法和屬性都有static,不用創建對象就可調用。


Integer的屬性主要有:

最小值(public staticfinal int  MIN_VALUE = 0x80000000;(-2^31)

最小值(public staticfinal int  MAX_VALUE = 0x7fffffff;(2^31-1)

      這裏解釋下爲什麼最小值是0x80000000;首先Integerint的包裝類,即所佔位數和int一樣,佔4個字節即32位,由於電腦中儲存數字的最高位爲符號位,且以補碼形式儲存數字,所以最小值爲-2^31,且儲存形式是100***0001後面310)。這是補碼錶示法的特殊性造成的,因爲原碼的正負0不同如0000000010000000,而補碼的正負0都用00000000表示,因爲10000000除符號位取反再加1後就是00000000,最高位溢出,所以正負0都一樣。而原來表示負010000000就規定用來表示最小的整數-2^7,其中1既表示符號位又表示數值位。推到整個補碼錶示法就是當符號位爲1而數值位全爲0時,表示整數-2^(n-1),由於int32位,所以最小值就是-2^31,用1310表示。這個二進制數轉化成十六進制就是0x80000000


接着是Integer的一些方法:


toString(int i,int radix):此方法將int型的值轉換爲相應進制數的字符串。其中i表示要轉換的int值,radix表示要轉換的進制基數,如2348等。當然此方法只能轉換成2-36內的進制數,超出此範圍皆以10進制轉換。返回的值爲String類型。值得注意的是此方法將負數轉化成二進制時僅僅只是在正數的相應進制前添加負號,並不是像toBinaryString(int i)那樣將對應的補碼完全給出。

publicclassTest01 {

   publicstaticvoidmain(String[] args) {     

       System.out.println(Integer.toString(100,2));

    }

}

輸出爲1100100

publicclassTest01 {

   publicstaticvoidmain(String[] args) {     

       System.out.println(Integer.toString(100,1));

    }

}

輸出爲100

 

toUnsignedString(inti, int shift):此方法將i轉換爲相應的無符號位數字的字符串。參數i是要轉換的int值,shift是方法內1的左偏移量,例如1<<38。返回值也是String類型。此方法是toHexString(int i)toOctalString(int i)toBinaryString(int i)內部調用的方法,分別調用toUnsignedString(i, 4)toUnsignedString(i, 3)toUnsignedString(i, 1)。此方法主要靠>>>(無符號右移:符號位也移動,但符號位都補0>>右移則相當於符號位不移動,空缺位補0)和&(與運算,直接都轉化爲二進制相加,只有11結果才爲1,其它都爲0)判定Integerdigits裏的下標,再一一逆向添加進新的字符數組內,最後用String拼接。

源碼爲:

finalstaticchar[]digits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };

 

privatestaticString toUnsignedString(int i,intshift) {

       char[]buf =newchar[32];

       intcharPos = 32;

       intradix = 1 << shift;

       int mask= radix - 1;

       do {

            buf[--charPos] =digits[i& mask];

                        i >>>= shift;

        }while (i!= 0);

       returnnewString(buf, charPos, (32 - charPos));

    }

當爲2進制時,1的左偏移量爲18進制的1左偏移爲316進制的1左偏移爲4。(寫偏移量主要用於i>>>= shift;不除以進制基數主要考慮正負數問題)。

當爲二進制時,mask1,而1的二進制數爲000….0001,即無論i爲何值,i&mask的結果只看i的二進制數最後一位,因爲1前面都爲0,所以imask的二進制&運算的前面31位都爲0,所以當i二進制最後一位爲1時(此時i爲奇數),i&mask的結果爲1,反之爲0。而digits下標爲01的又是’0’’1’,加上偶數除以2的餘數爲0(偶數&1的結果爲0),奇數除以2的餘數爲1(奇數&1的結果爲1),它們有對應關係,直接將digits中的’0’’1’對應的逆序添加到buf字符數組中,再通過String合成就行。

至於8進制和16進制和二進制差不多,只不過maski的值都會發生相應變化,所對應的下標值也很驚奇的與相應的進制結果一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章