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。