java long_java封装数据类型——Long

Long 是长整型 long 的封装数据类型。我们知道 long 相对于 int 的差异就是数据表示的范围扩大了,其它大部分特性都是一样的。所以 Long 跟 Integer 大部分方法都是相同的。

下面列出一些有差异的特性:

1. 缓存机制

跟 Integer 类型一样,Long 也提供了缓存机制。那么是不是如 long 比 int 范围大,Long 比 Integer 缓存范围也要大呢?其实没有。而且 Long 型取消缓存最大值的配置性,直接设定 缓存范围是  [-128, 127] 。

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

cache[i]= new Long(i - 128);

}

}

2. hashCode() 值

Integer 类型 hashCode 值就是它保存的 int 值,那么 Long 是否也是它所保存的 long 值呢?答案当然是否。因为根据常规约定,hashCode 值是一个 int 数值,long 型显然不合适,于是 Long 对其值做了处理,以得到一个 int 类型能够表示的值:

public static int hashCode(longvalue) {return (int)(value ^ (value >>> 32));

}

可以看出,Long 将 值进行操作得到 hashCode:

2.1. long 值 按位补零右移32位,此时得到的结果的高32位全部是0,而低32位则是原来的高32位;

2.2. 将 2.1 中得到的结果与 long 值按位异或运算,此时得到的值的高32位与原 long 值的一样,低32位是原 long 值的高32位与低32位异或的结果;

2.3. 将 2.2 中得到的 long 值结果强制转换成 int 型;

上述步骤中最关键的就是 按位异或 了,强转之后,高位已经丢失,留下按位异或后的低位,这样就能得到相对散列的哈希值了。

下面我们举一个缩小版的例子:

约定:

1. 使用一个字节类比 long 型,半个字节(4 bits)类比 int 型;

2. 使用原码表示法;

3. 无符号位;

目的:将大于 15(4个bits能够表示的最大值)的数计算后得到 [0, 15](无符号原码 4 bits能够表示的范围)之间的数值。

例子:248、43

1. 上述两个数的无符号源码表示为:11111000、00101011

2.分别补零右移4位得到:00001111、00000010

3.右移前后按位异或得到:11110111、00101001

4.丢弃高位后得到:0111、1001

5.转换成数值为:7、9

可以看到,在原码表示法下,原来使用 4个bit位表示不了的的两个数 248 和 43 ,通过一系列按位运算,现在散列在了 4 个 bit 能够表示的数值,目的达到了。

注意:上述只是一个简单的类比的例子,实际计算机中计算的是补码,而且字节长度分别为 8 bytes 和 4 bytes。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值