JDK8源码解析 --- Long 类型

  最近都在看JDK8的源码,想把记录下来与大家一起共享,每天 积累一点,每天成长一点。看了装箱Long类型,有好多以前没有注意到或者不知道的内容,慢慢懂得。废话不多说,直接上代码讲解。。。

1.缓存区LongCache

     Long装箱类中有LongCache静态私有类作为缓存区域,范围是-128到127,只要声明了一个Long在这个区域类的话,返回给我们的数据都是从这个缓存区域中获取的,超过了此范围的话,会重新生成一个Long的数据。所以在-128到127范围中,我们获取的数值相同,都是同一个内存里面的数据,所以两个Long类型比较大小的时候,使用 “==” 符号是可以进行比较大小的,但是超过了这个范围的就不可以了。因为装箱类型是对象,那么对象可以使用 “==” 进行比较大小吗?后面我会说明怎么进行比较大小。装箱类可以为null,正因为它是对象。new 对象会在内存中生成一个区域,没有取缓存中的数据,为了节省内存空间,生成一个Longl类型对象,我们使用 Long.valueOf() 静态方法。Long中的value属性是final,不变属性与String类型一样。注意:long基本类型在赋相同的值的时候,超过了-128至127此范围,就会自动进行装箱,赋值的内存位置是不一样的,long进行比较的时候使用 “==” 就可以了。

   1) LongCache源码

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

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

   

 

2.Long类型比较大小

    Long类中重写了equals方法,它是先转化为基本类型long(拆箱),再进行大小比较。

   1)equals源码

 // Long 的比较方法 ,先转化为拆箱类,再进行比较
    public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

 

 

下面是自己写的一些测试用例和结果:

        Long i1 = Long.valueOf( 127 );
        Long i2 = Long.valueOf( 127 );
        System.out.println(i1 == i2);
        System.out.println(i1.equals( i2 ));
        System.out.println("i1 内存:" + System.identityHashCode( i1 ));
        System.out.println("i2 内存:" + System.identityHashCode( i2 ));

        Long i3 = Long.valueOf( 1270 );
        Long i4 = Long.valueOf( 1270 );
        System.out.println(i3 == i4);
        System.out.println(i3.equals( i4 ));
        System.out.println("i3 内存:" + System.identityHashCode( i3 ));
        System.out.println("i4 内存:" + System.identityHashCode( i4 ));

        System.out.println(" ======== long 自动装箱 ============");
        long i5 = 1299;
        long i6 = 1299;
        System.out.println(i5 == i6);
        System.out.println("i5 内存:" +System.identityHashCode( i5 ));
        System.out.println("i6 内存:" +System.identityHashCode( i6 ));

结果:

         true
         true
         i1 内存:21685669
         i2 内存:21685669


         false
         true
         i3 内存:2133927002
         i4 内存:1836019240


         ======== long 自动装箱 ============
         true
         i5 内存:325040804
         i6 内存:1173230247

 

转载于:https://www.cnblogs.com/javJoker/p/11365717.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值