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,这个有意思多了 噗嗤

原文地址:https://www.cnblogs.com/sariseBlog/p/14942035.html