JDK原始碼筆記02 Long
阿新 • • 發佈:2021-06-27
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,這個有意思多了 噗嗤