最近都在看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

JDK8源码解析 --- Long 类型的更多相关文章

  1. JDK8源码解析 -- HashMap(二)

    在上一篇JDK8源码解析 -- HashMap(一)的博客中关于HashMap的重要知识点已经讲了差不多了,还有一些内容我会在今天这篇博客中说说,同时我也会把一些我不懂的问题抛出来,希望看到我这篇博客 ...

  2. JDK8源码解析 -- HashMap(一)

    最近一直在忙于项目开发的事情,没有时间去学习一些新知识,但用忙里偷闲的时间把jdk8的hashMap源码看完了,也做了详细的笔记,我会把一些重要知识点分享给大家.大家都知道,HashMap类型也是面试 ...

  3. 面试必备:ArrayList源码解析(JDK8)

    面试必备:ArrayList源码解析(JDK8) https://blog.csdn.net/zxt0601/article/details/77281231 概述很久没有写博客了,准确的说17年以来 ...

  4. Scala 深入浅出实战经典 第48讲:Scala类型约束代码实战及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. JDK8集合类源码解析 - HashSet

    HashSet 特点:不允许放入重复元素 查看源码,发现HashSet是基于HashMap来实现的,对HashMap做了一次“封装”. private transient HashMap<E,O ...

  6. springboot源码解析-管中窥豹系列之项目类型(二)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  7. Java中的容器(集合)之ArrayList源码解析

    1.ArrayList源码解析 源码解析: 如下源码来自JDK8(如需查看ArrayList扩容源码解析请跳转至<Java中的容器(集合)>第十条):. package java.util ...

  8. ArrayList源码解析,老哥,来一起复习一哈?

    前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会,我... 类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口,可以 ...

  9. Java之ConcurrentHashMap源码解析

    ConcurrentHashMap源码解析 目录 ConcurrentHashMap源码解析 jdk8之前的实现原理 jdk8的实现原理 变量解释 初始化 初始化table put操作 hash算法 ...

随机推荐

  1. 为什么 Redis 单线程能支撑高并发?

    阅读本文大概需要 4 分钟. 作者:Draveness 最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutipl ...

  2. ubuntu之路——day17.3 简单的CNN和CNN的常用结构池化层

    来看上图的简单CNN: 从39x39x3的原始图像 不填充且步长为1的情况下经过3x3的10个filter卷积后 得到了 37x37x10的数据 不填充且步长为2的情况下经过5x5的20个filter ...

  3. 【技术博客】Django+uginx+uwsgi框架的服务器部署

    1.登录服务器 使用ssh来直接登录到服务器terminal进行操作,推荐使用XShell和XFtp来进行远程登录和文件传输. 2.运行环境准备 本组获得的华为云服务器为ubuntu16.04版本,先 ...

  4. ANR日志分析

    2018年06月27日 16:28:13 Hello__code 阅读数 3427更多 分类专栏: bug记录   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  5. hive分区与实际分区文件不匹配导致spark读文件出错的问题解决

    先解释下,由于历史原因导致hive中的看到分区比hdfs中的文件夹不匹配,存在hive中分区数有,实际hdfs中无此文件夹. spark中通过sparkSQL读取hive中的该表时,将会出现异常. 解 ...

  6. vue-cli webpack打包开启Gzip 报错—— Cannot find module 'compression-webpack-plugin

    异常描述: 复用以前框架,打包的时候报异常提示: Cannot find module 'compression-webpack-plugin" 然后安装插件: npm install -- ...

  7. EV录屏 --- 免费无水印,集视频录制与直播功能于一身的桌面录屏软件, 支持录屏涂鸦、实时按键显示、视频体积压缩等实用功能

    https://www.ieway.cn/index.html 免费无水印,集视频录制与直播功能于一身的桌面录屏软件,支持录屏涂鸦.实时按键显示.视频体积压缩等实用功能 EVCapture 3.9.7 ...

  8. Android Studio + opencv开发配置

    1 下载Android Studio https://developer.android.com/studio/archive?hl=zh-cn 2 安装Android Studio 安装完成,下载S ...

  9. awk(gawk)文本报告生成器

    awk是gawk的链接文件,是一种优良的文本处理工具,实现格式化文本输出,是Linux和Unix现有环境中功能最强大的数据处理引擎之一.这种编程及数据操作语言的最大功能取决于一个人拥有的知识量,使用& ...

  10. BladeX 部署centos启动顺序

    一:启动dockerservice docker start二:启动mysqldocker start mysql三:启动Harborsystemctl restart docker(如有修改daem ...