文档章节

Long类源码阅读

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

一、类说明

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


© 著作权归作者所有

共有 人打赏支持
夏夜流星
粉丝 6
博文 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
开源中国 OsChina Android 客户端源码分析(10)双击退出程序

在源码中,火蚁完全封装了 双击退出程序的功能 : DoubleClickExitHelper类 该类的源码分析如下: 1 构造函数中传入了 设备上下文,实现退出功能的界面,完成消息处理器的初始化;既然要有提...

姬鑫
2015/11/02
0
1
从JDK源码看Writer

概况 Writer 是一个用于写字符流的抽象类,它将一些相通的写相关操作抽象到此类,方便各种写操作类的实现。一般来说子类只需要实现它的 write、flush 、close 等三个方法,但如果有需要还可以...

超人汪小建
2017/10/30
0
0
从JDK源码角度看Long

概况 Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转...

超人汪小建
2017/09/19
0
0
Timer与TimerTask源码阅读杂记

TimerTask 实现Runnable接口。可以被Timer调度执行一次或者周期性执行的任务类。位于java.util包内。 实例属性: int state; // 包括VIRGIN、SCHEDULED、EXECUTED、CANCELLED long nextExec...

优雅先生
2014/02/26
0
0
从JDK源码看关闭钩子

关闭钩子 Java提供了Shutdown Hook机制,它让我们在程序正常退出或者发生异常时能有机会做一些清场工作。使用的方法也很简单,即可。关闭钩子其实可以看成是一个已经初始化了的但还没启动的线...

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python -re模块及正则表达式解析

传送门: https://blog.csdn.net/pipisorry/article/details/25909899 ps:上面文章中"命名分组"的语法格式不能执行。正确的如下: (?P<name>正则表达式) #name是一个合法的标识符 除了使用别名...

一口今心
12分钟前
0
0
mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
21分钟前
1
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
21分钟前
9
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
30分钟前
1
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
33分钟前
1
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
35分钟前
1
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
38分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
42分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
46分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部