Long类源码阅读
Long类源码阅读
夏夜流星 发表于4年前
Long类源码阅读
  • 发表于 4年前
  • 阅读 169
  • 收藏 3
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: Java源码中Long类的源码阅读。

一、类说明

    Long类是用来包装原始类型long的类,用以表示原始类型long的面向对象的类。类中包含了原始类型long的值及相应的操作。

二、方法解析

    1.public static int bitCount(long i) --获取二进制补码中1的数量

public static int bitCount(long i) { //采取平行算法进行计算
        // HD, Figure 5-14
        //1.求出i对应的二进制数的每两位之和,比如(01)(11)(10)(00)-->(01)(10)(01)(00)
        i = i - ((i >>> 1) & 0x5555555555555555L);
        //2.求出(1.)中i对应的二进制数的每四位之和,比如(0110)(0001)(1001)(1001)
        //-->(0010)(0001)(0010)(0010)
        i = (i & 0x3333333333333333L) + ((i >>> 2) & 0x3333333333333333L);
        //3.同上求出(2.)中i的二进制数的每八位之和。
        i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
        //4.同上求出(3.)中i的二进制数的每十六位之和。
        i = i + (i >>> 8);
        //5.同上求出(4.)中i的二进制数的每三十二位之和。
        i = i + (i >>> 16);
        //6.同上求出(5.)中i的二进制数的每六十四位之和。
        i = i + (i >>> 32);
        //1的个数最多也不会超过64个,所以只取最后7位即可。
        return (int)i & 0x7f; 
     }

    2.public byte byteValue() --返回Long型数的Byte值

public byte byteValue() {
        //long的最大长度为64bits,byte的最大长度为8bits,该方法取long值的末8bits得到的值 
        return (byte)value;
    }

    3.public static int compare(long x,long y) --比较x,y的大小,x>y返回1,x==y返回0,x<y返回-1

public static int compare(long x, long y) {
        //如果x<y直接返回-1,否则比较x==y是否成立,返回0,如果均不成立,即x>y的情况,返回1
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }

    4.public int compareTo(Long anotherLong) --比较当前值与anotherLong的大小,x>y返回1,x==y返回0,x<y返回-1

public int compareTo(Long anotherLong) {
        //调用方法3进行判断,返回值同3一致
        return compare(this.value, anotherLong.value);
    }

    5.public static Long decode(String nm) throws NumberFormatException --将16进制、10进制、8进制、2进制等的字符串转换为Long型的数字

public static Long decode(String nm) throws NumberFormatException {
        int radix = 10; //默认为10进制
        int index = 0;
        boolean negative = false;
        Long result;

        if (nm.length() == 0)
            throw new NumberFormatException("Zero length string");
        //获取nm字符串的第一位,判断是否为'+'、'-'
        char firstChar = nm.charAt(0);
        // Handle sign, if present
        if (firstChar == '-') {
            negative = true;
            index++;
        } else if (firstChar == '+')
            index++;

        // Handle radix specifier, if present
        if (nm.startsWith("0x", index) || nm.startsWith("0X", index)) { //处理十六进制字符串
            index += 2;
            radix = 16;
        }
        else if (nm.startsWith("#", index)) { //处理十六进制字符串
            index ++;
            radix = 16;
        }
        else if (nm.startsWith("0", index) && nm.length() > 1 + index) { //处理八进制字符串
            index ++;
            radix = 8;
        }
        //此时的index为符号位加上进制标识位后的位数,如果此时出现'+'、'-',则抛出异常
        if (nm.startsWith("-", index) || nm.startsWith("+", index))
            throw new NumberFormatException("Sign character in wrong position");

        try {
            //获取指定进制下除进制标志位与符号位的Long型值
            result = Long.valueOf(nm.substring(index), radix); 
            //判断是否为负数
            result = negative ? Long.valueOf(-result.longValue()) : result;
        } catch (NumberFormatException e) {
            // If number is Long.MIN_VALUE, we'll end up here. The next line
            // handles this case, and causes any genuine format error to be
            // rethrown.
            String constant = negative ? ("-" + nm.substring(index))
                                       : nm.substring(index);
            result = Long.valueOf(constant, radix);
        }
        return result;
    }

    6.public double doubleValue() --返回Long型数的Double值

public double doubleValue() {
        //因为Double的长度与Long的长度一致,故Double将包含Long的值并返回
        return (double)value;
    }

    7.public boolean equals(Object obj) --对比当前Long型对象是否与obj对象相等

public boolean equals(Object obj) {
        if (obj instanceof Long) { //如果obj是Long的示例,直接进行值的比较
            return value == ((Long)obj).longValue();
        }
        return false;
    }

    8.public float floatValue() --返回Long型数的Float值

public float floatValue() {
        //long的最大长度为64bits,float的最大长度为32bits,该方法取long值的末32bits得到的值
        return (float)value;
    }

    9.public static Long getLong(String nm) --获取nm指定的系统属性的Long型表示

public static Long getLong(String nm) {
        return getLong(nm, null);
    }

    10.public static Long getLong(String nm,long val) --获取nm指定的系统属性的Long型表示,val为默认值

public static Long getLong(String nm, long val) {
        Long result = Long.getLong(nm, null);
        return (result == null) ? Long.valueOf(val) : result; //result为空时,则返回默认值
    }

    11.public static Long getLong(String nm,long val) --获取nm指定的系统属性的Long型表示,val为默认值

public static Long getLong(String nm, Long val) {
        String v = null;
        try {
            v = System.getProperty(nm); //根据nm获取系统属性的编码
        } catch (IllegalArgumentException e) {
        } catch (NullPointerException e) {
        }
        if (v != null) {
            try {
                return Long.decode(v); //将编码转换为Long型值
            } catch (NumberFormatException e) {
            }
        }
        return val;
    }

    12.public int hashCode() --返回Long类型对象的Hash码

public int hashCode() {
        //返回当前Long的值的位移操作结果
        return (int)(value ^ (value >>> 32));
    }

    13.public static long highestOneBit(long i) --返回Long型数二进制位左边第一个1时,剩余位补0的结果值

public static long highestOneBit(long i) {
        // HD, Figure 3-1
        i |= (i >>  1); //右移一位,并与i进行或操作,使得最高两位全为1
        i |= (i >>  2); //右移两位,并与i进行或操作,使得最高四位全为1
        i |= (i >>  4); //右移四位,并与i进行或操作,使得最高八位全为1
        i |= (i >>  8); //右移八位,并与i进行或操作,使得最高十六位全为1
        i |= (i >> 16); //右移十六位,并与i进行或操作,使得最高三十二位全为1
        i |= (i >> 32); //右移三十二位,并与i进行或操作,使得最高六十四位全为1
        return i - (i >>> 1);
    }


标签: jdk source Long
共有 人打赏支持
粉丝 7
博文 4
码字总数 3844
×
夏夜流星
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: