文档章节

Long类源码阅读

夏夜流星
 夏夜流星
发布于 2014/01/02 16:22
字数 1324
阅读 175
收藏 3

一、类说明

    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);
    }


© 著作权归作者所有

共有 人打赏支持
夏夜流星
粉丝 7
博文 4
码字总数 3844
作品 0
沙坪坝
程序员
私信 提问
java.lang包源码阅读之一:类目综述以及源码阅读第一个类Boolean

java.lang包下直属类,从Java Platform Standard Edition 7 Documentation中一查便知: 大体上按照上面的分类阅读,估计应该学别人的体例-------关键代码分析,加上编译通过可运行的用例。类...

treenewtreenew
2016/10/24
48
0
Rx2:小create,大文章

前言 自从去年8月底《浅谈RxJava与2.0的新特性》,已经过去快一年。笔者也没想到此文竟有读者等笔者填坑快一年了,不禁汗颜。所以笔者打算写关于一个 RxJava2 的系列文章,既为填坑,也为回报...

任我行
2017/08/14
0
0
join(long)与sleep(long)的区别

1.join(long)方法的源码 首先看join()源码: public final void join() throws InterruptedException {join(0); } 从源码中可以看出,join()直接调用了join(long)方法,join(long)源码如下:...

LoveOne
2015/12/14
464
0
Java并发学习(四)-sun.misc.Unsafe

Unsafe Unsafe类是什么呢?java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作。或许在读源码时候会发现,LockSupport里面会调用到unsafe.park,und...

anLA_
2017/11/26
0
0
Java 中int和Integer有什么区别

面对上面的问题,你该怎么回答? 典型回答 int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte、short、char、int、float、double、long)之一。Java ...

我爱春天的毛毛雨
11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 源代码和 C 源代码的运行区别

与其他程序的执行方式和编译方式不同。 Java 源代码需要进行编译成字节码后在 Java 虚拟机上运行,这样 Java 程序能够保持独立性和跨平台功特性。 请参考下图。 https://www.cwiki.us/pages...

honeymose
今天
3
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
今天
5
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
6
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
5
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部