深入学习java源码之Long.valueOf()与Long.doubleValue()

深入学习java源码之Long.valueOf()与Long.doubleValue() 

在Long的源代码中,可以找到LongCache内部类的代码:

private static class LongCache {
        private LongCache(){}
 
        static final Long cache[] = new Long[-(-128) + 127 + 1];
 
        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Long(i - 128);
        }
    }

从LongCache的代码可以很容易看出来,在类初始化的时候,便生成了一个final的static的Long类型数组,数组的范围是-128到127。

Long类型的valueOf方法代码如下:

public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

从以上两个代码中不难发现,当外部程序调用了valueOf方法时,Java先判断欲生成的Long对象是否在LongCache.cache数组的范围内,如果是,则直接返回已经存在cache数组的Long对象引用。根据之前对String类型的研究,这应该是通过重复使用对象的引用,从而实现了较高的性能和较少的内存消耗。此外,经过测试,通过“Long = long”方式生成的Long对象,称为自动封箱,也有相同的逻辑。
所以也就不难知道,当实际的long大小超过正数127时,判断两个封装类==时,会返回false。
另外一种情况,通过new方式生成的两个等值的对象,是否会有相同的效果呢?经过测试,是否定的。两次new出来的对象,都是在内存中新划分区域生成的对象,除非重写方法,否则是绝对不能通过==进行比较的。
 

for(;;)和while(true)的区别

“死循环”有两种写法:for(;;)和while(true),

编译前              编译后 
while (1);         mov eax,1  
                          test eax,eax 
                          je foo+23h
                          jmp foo+18h

 编译前              编译后 
 for (;;);     jmp foo+23h   

一目了然,for (;;)指令少,不占用寄存器,而且没有判断跳转,比while (1)好。

也就是说两者在在宏观上完全一样的逻辑,但是底层完全不一样,for相对于来说更加简洁明了。
 

 

Modifier and TypeMethod and Description
static intbitCount(long i)

返回指定的long值的二进制补码二进制表示中的 long数。

bytebyteValue()

返回此值 Longbyte的基本收缩转换后。

static intcompare(long x, long y)

数值比较两个 long值。

intcompareTo(Long anotherLong)

以数字比较两个 Long对象。

static intcompareUnsigned(long x, long y)

比较两个 long值以数值方式将值视为无符号。

static Longdecode(String nm)

String解码为 Long

static longdivideUnsigned(long dividend, long divisor)

返回将第一个参数除以秒的无符号商,其中每个参数和结果被解释为无符号值。

doubledoubleValue()

返回此值 Longdouble一个宽元转换后。

booleanequals(Object obj)

将此对象与指定的对象进行比较。

floatfloatValue()

返回此值 Longfloat一个宽元转换后。

static LonggetLong(String nm)

确定 long具有指定名称的系统属性的值。

static LonggetLong(String nm, long val)

确定 long具有指定名称的系统属性的值。

static LonggetLong(String nm, Long val)

以指定的 long返回系统属性的 long值。

inthashCode()

返回这个 Long的哈希码。

static inthashCode(long value)

返回一个long值的哈希码; 兼容Long.hashCode()

static longhighestOneBit(long i)

返回一个 long值至多一个单个1位,在最高阶(“最左侧”)的位置在指定的一个位 long值。

intintValue()

int后,返回 Long作为int的值。

longlongValue()

返回此值 Longlong值。

static longlowestOneBit(long i)

返回一个 long值至多一个单个1位,在最低阶(“最右边的”)的位置在指定的一个位 long值。

static longmax(long a, long b)

返回两个 long的较大值,就像调用 Math.max一样

static longmin(long a, long b)

返回两个 long的较小值,就像调用 Math.min一样

static intnumberOfLeadingZeros(long i)

返回的最高阶的(“最左边的”)中所指定的二进制补码表示的一个位前述零个比特的数量 long值。

static intnumberOfTrailingZeros(long i)

返回零位以下最低阶(“最右边的”)的数量在指定的二进制补码表示的一个位 long值。

static longparseLong(String s)

将字符串参数解析为带符号的十进制 long

static longparseLong(String s, int radix)

将字符串参数解析为由第二个参数指定的基数中的带符号的 long

static longparseUnsignedLong(String s)

将字符串参数解析为无符号十进制 long

static longparseUnsignedLong(String s, int radix)

将字符串参数解析为第二个参数指定的基数中的无符号 long

static longremainderUnsigned(long dividend, long divisor)

返回无符号余数,将第一个参数除以秒,其中每个参数和结果被解释为无符号值。

static longreverse(long i)

返回由指定的二进制补码表示反转位的顺序而获得的值 long值。

static longreverseBytes(long i)

返回反转指定的二进制补码表示的字节顺序而获得的值 long值。

static longrotateLeft(long i, int distance)

返回通过旋转指定的位数剩下的指定 long值的二进制补码二进制表示获得的值。

static longrotateRight(long i, int distance)

返回通过旋转指定的二的补码的二进制表示而得到的值 long右移位的指定数值。

shortshortValue()

short后,返回 Long作为short的值。

static intsignum(long i)

返回指定的 long值的signum函数。

static longsum(long a, long b)

根据+操作符将两个 long值一起添加。

static StringtoBinaryString(long i)

返回 long参数的字符串表示形式为基数2中的无符号整数。

static StringtoHexString(long i)

返回 long参数的字符串表示形式,作为16位中的无符号整数。

static StringtoOctalString(long i)

返回 long参数的字符串表示形式,作为基数8中的无符号整数。

StringtoString()

返回 String表示此对象 Long的价值。

static StringtoString(long i)

返回 String表示指定对象 long

static StringtoString(long i, int radix)

返回由第二个参数指定的基数中的第一个参数的字符串表示形式。

static StringtoUnsignedString(long i)

将参数的字符串表示形式返回为无符号十进制值。

static StringtoUnsignedString(long i, int radix)

以第二个参数指定的基数中的无符号整数值返回第一个参数的字符串表示形式。

static LongvalueOf(long l)

返回一个 Long指定的 long值的 Long实例。

static LongvalueOf(String s)

返回一个 Long指定的 Long的值的Long String

static LongvalueOf(String s, int radix)

返回一个 Long对象,该对象保存从指定的String String的值,并用第二个参数给出的基数进行解析。

java源码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wespten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值