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

  Integer 学习篇:https://www.cnblogs.com/coding-one/p/11387983.html

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

1. 缓存机制

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

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

2. hashCode() 值

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

    public static int hashCode(long value) {
return (int)(value ^ (value >>> ));
}

  可以看出,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。

  

    

java封装数据类型——Long的更多相关文章

  1. java封装数据类型——Integer

    今天来学习整型 int 的封装数据类型,Integer. 1. 定义 首先来看看定义.可以看到,Integer 继承 Number 抽象类,实现了 Comparable 接口.Number 类是常用数 ...

  2. java封装数据类型——Boolean

    众所周知,java对常见的原始数据类型都提供了对应的封装类型,增加一些常用的特性(如 计算hash值.比较相等.类型转换等),以扩展他们对数据处理的能力,使得他们更好地适应面向对象编程的各种场景.今天 ...

  3. java封装数据类型——Byte

    Byte 是基本类型byte的封装类型.与Integer类似,Byte也提供了很多相同的方法,如 decode.toString.intValue.floatValue等,而且很多方法还是直接类型转换 ...

  4. java封装数据类型——Integer 缓存策略验证

    上一篇学习 Integer 类型源码,知道了它使用缓存策略,默认对 [-128, 127] 范围的对象进行类加载时自动创建缓存. Integer 源码学习:https://www.cnblogs.co ...

  5. 【转】java基本数据类型vs封装数据类型

    1.基本概念 说java是面向对象的语言是正确的,但是她不纯,基本数据类型就不是对象. 基本数据类型可以大致分为三类:数据型:int.short.long.byte.float.double字符型:c ...

  6. Java 基本数据类型 sizeof 功能【转】

    转自:http://blog.csdn.net/sunboy_2050/article/details/7310008 版权声明:本文为博主原创文章,未经博主允许不得转载. Java基本数据类型int ...

  7. java基础之java基本数据类型

    1.Java数据类型基本概念: 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的.简单的,各种数据 ...

  8. Java基本数据类型总结、类型转换、常量的声明规范,final关键字的用法

    1  Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过 ...

  9. Java 基本数据类型 sizeof 功能

    Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int     32b ...

随机推荐

  1. return EXIT_SUCCESS;

    就是 return 0; EXIT_SUCCESS是C语言头文件库中定义的一个符号常量. 头文件stdlib.h中:#include <cstdlib> /* Definition of ...

  2. js实现文本框支持加减运算的方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/T ...

  3. 【Leetcode_easy】1078. Occurrences After Bigram

    problem 1078. Occurrences After Bigram 题意 solution: class Solution { public: vector<string> fi ...

  4. 【Leetcode_easy】1108. Defanging an IP Address

    problem 1108. Defanging an IP Address solution: class Solution { public: string defangIPaddr(string ...

  5. iOS-DatePicket

    组件_DatePicket /** 1.初始化 2.设置选择控件的格式 3.设置日期选择控件的地区 4.监听日期选择控件数值变化 **/ UIDatePicker *datePicker = [[UI ...

  6. swift 屏幕的翻转 + 状态栏(statusBar)的隐藏

    1.状态栏的隐藏 这个问题是基于 UIApplication.shared.isStatusBarHidden = true; 调用居然是无效的…… 现在写下自己的代码,用来备忘吧…… 1.首先需要复 ...

  7. jenkins插件Configuration Slicing plugin批量修改配置

    作用 批量修改jenkins上job配置

  8. 如何使用 AWS Auto Scaling 按需动态增加和减少实例

    目录 一.背景需求 二.配置步骤 2.1.创建 AMI 2.2.创建负载均衡目标组 2.3.创建 Classic Load Balancer 2.4.创建启动配置 2.5.创建 Auto Scalin ...

  9. thinkPHP 类库映射 类库导入

    遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射.命名类库映射相当于给类文件定义了一个别名, ...

  10. 判断浏览器是否ie6

    if ($.browser.msie && ($.browser.version == "6.0") && !$.support.style) { ...