1. 程式人生 > 其它 >JDK原始碼筆記02 Long

JDK原始碼筆記02 Long

something before start

寫到第二篇了:D
有很多類似的方法就不重複描述了,稍微帶過。主要講講和Integer差別比較大的方法
另外這裡我寫的方法概覽裡不一定有所有的方法,因為有的我懶得寫下來或者覺得沒必要。所以這個部落格其實不是使用說明書而是原始碼閱讀說明:D

和Integer區別

一些常量有區別,Long是64位,所以他的MIN_VALUE MAX_VALUE相應變長了
一些方法如toString getChars parseLong valueOf decode getLong以及一些位處理方法,和Integer的差別只在於位數變長了
同時快取基本上完全一樣

方法以及子類概覽

方法以及簡單說明

輸出字串

toUnsignedString(long i, int radix) 
//二倍數進位制呼叫toUnsignedString0(long val, int shift)
//十進位制 先右移1位然後除以5(邏輯上除以10,不過這樣不會影響符號位),把除了個位的部分轉換成字串,然後在最後拼接個位數。 不這麼做的話也可以通過轉換成BigInteger,但是效能會差點。
//否則呼叫toUnsignedBigInteger(i).toString(radix);

toUnsignedString0(long val, int shift)
//類似於Ingeter 採用位運算來進行短除法,結果逐位放在byte[]陣列中,最後返回字串

BigInteger相關

private static toUnsignedBigInteger(long i) 
//位運算取出高32位和低32位,再通過BigInteger合併高低位

fastUUID

Long類裡提供了UUID的toString方法,即fastUUID(long lsb, long msb),具體可以參考這篇部落格

運算

divideUnsigned(long dividend, long divisor)
//divisor<0 則只需要比無符號長整形數值大小 返回0或1
//dividend>0 直接除
//否則先轉換成BigInteger再進行運算

雜七雜八

雜湊

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

方法詳解

解析字串

parseUnsignedLong

簽名public static long parseUnsignedLong(String s, int radix) throws NumberFormatException
功能:將無符號長整數字符串轉換成long
說明
相關方法

parseUnsignedLong(CharSequence s, int beginIndex, int endIndex, int radix)
parseUnsignedLong(String s)

主要程式碼說明

//引數校驗

//判斷,如果是能確保不會是負數的話呼叫parseLong(String s, int radix) 
//len <= 12 || // 最大值在最大的進位制下是13位,所以小於等於12位可以不考慮符號
//(radix == 10 && len <= 18)) { //十進位制最多19位,18位及以下不需要考慮符合

//先計算len-1長度的大小 作為first
long first = parseLong(s, 0, len - 1, radix);
//取出最後一位的大小 作為second
//Character.digit()的功能是取出符號對應的數字的值
int second = Character.digit(s.charAt(len - 1), radix);
//判斷second是否大於0,小於等於0則丟擲異常
long result = first * radix + second;

//判斷result是否溢位了 原始碼裡還寫了證明,數字問題我有點懶得看:C
//沒問題則返回result

總結

就和Integer差不多,不過看這個的時候順帶看了一眼BigInteger,這個有意思多了 噗嗤