java封裝數據類型——Long


  Long 是長整型 long 的封裝數據類型。我們知道 long 相對於 int 的差異就是數據表示的范圍擴大了,其它大部分特性都是一樣的。所以 Long 跟 Integer 大部分方法都是相同的。

  Integer 學習篇:https://www.cnblogs.com/coding-one/p/11387983.html

  下面列出一些有差異的特性:

 

1. 緩存機制

  跟 Integer 類型一樣,Long 也提供了緩存機制。那么是不是如 long 比 int 范圍大,Long 比 Integer 緩存范圍也要大呢?其實沒有。而且 Long 型取消緩存最大值的配置性,直接設定 緩存范圍是  [-128, 127] 。

    private static class LongCache {
        private LongCache(){}

        static final Long cache[] = new Long[-(-128) + 127 + 1];

        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Long(i - 128);
        }
    }

 

2. hashCode() 值

  Integer 類型 hashCode 值就是它保存的 int 值,那么 Long 是否也是它所保存的 long 值呢?答案當然是否。因為根據常規約定,hashCode 值是一個 int 數值,long 型顯然不合適,於是 Long 對其值做了處理,以得到一個 int 類型能夠表示的值:

    public static int hashCode(long value) {
        return (int)(value ^ (value >>> 32));
    }

  可以看出,Long 將 值進行操作得到 hashCode:

    2.1. long 值 按位補零右移32位,此時得到的結果的高32位全部是0,而低32位則是原來的高32位;

    2.2. 將 2.1 中得到的結果與 long 值按位異或運算,此時得到的值的高32位與原 long 值的一樣,低32位是原 long 值的高32位與低32位異或的結果;

    2.3. 將 2.2 中得到的 long 值結果強制轉換成 int 型;

  上述步驟中最關鍵的就是 按位異或 了,強轉之后,高位已經丟失,留下按位異或后的低位,這樣就能得到相對散列的哈希值了。

 

  下面我們舉一個縮小版的例子:

    約定:

      1. 使用一個字節類比 long 型,半個字節(4 bits)類比 int 型;

      2. 使用原碼表示法;

      3. 無符號位;

    目的:將大於 15(4個bits能夠表示的最大值)的數計算后得到 [0, 15](無符號原碼 4 bits能夠表示的范圍)之間的數值。

    例子:248、43

      1. 上述兩個數的無符號源碼表示為:11111000、00101011

      2.分別補零右移4位得到:00001111、00000010

      3.右移前后按位異或得到:11110111、00101001

      4.丟棄高位后得到:0111、1001

      5.轉換成數值為:7、9

  可以看到,在原碼表示法下,原來使用 4個bit位表示不了的的兩個數 248 和 43 ,通過一系列按位運算,現在散列在了 4 個 bit 能夠表示的數值,目的達到了。

  注意:上述只是一個簡單的類比的例子,實際計算機中計算的是補碼,而且字節長度分別為 8 bytes 和 4 bytes。

  

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM