文档章节

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
从JDK源码看System.exit

前言 在编写的Java程序中有时会遇到用 System.exit 来关闭JVM,其中调用 exit 方法时会包含一个状态参数n,即。这其实是一个约定值,如果为0则表示正常关闭,而非0则表示非正常关闭。这里我们...

超人汪小建
2017/10/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《看图轻松理解数据结构与算法系列》导引贴

最近学习数据结构,遇到一个很喜欢的博主,他的文章图文并茂,理解起来很容易。特此开贴记录,方便反复阅读。 博主主页 https://juejin.im/user/57c3970f79bc440063e58518/posts?sort=popul...

科陆李明
43分钟前
1
0
20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
57分钟前
2
0
设计一个百万级的消息推送系统

前言 首先迟到的祝大家中秋快乐。 最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。 鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两...

crossoverJie
今天
2
0
软件架构:5种你应该知道的模式

Singleton(单例模式)、仓储模式(repository)、工厂模式(factory)、建造者模式(builder)、装饰模式(decorator)……大概每个上课听讲的程序员都不会陌生——软件的设计模式为我们提供...

好雨云帮
今天
3
0
OSChina 周二乱弹 —— 这只是一笔金钱交易

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《暮春秋色》- 窦唯 / 译乐队 《暮春秋色》- 窦唯 / 译乐队 手机党少年们想听歌,请使劲儿戳(这里) @我没有抓狂:跨服聊...

小小编辑
今天
1K
19

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部