转载自IntegerCache的妙用和陷阱

考虑下面的小程序,你认为会输出为什么结果?

    1. public class Test {
      1.     public static void main(String[] args) {
          1.         Integer n1 = 123;
            1.         Integer n2 = 123;
              1.         Integer n3 = 128;
                1.         Integer n4 = 128;
                    1.         System.out.println(n1 == n2);
                      1.         System.out.println(n3 == n4);
                        1.     }
                          1. }
                        1.  

                        答案如下,请选择刮开:

                        true

                        fase

                        是否和你预想的一致?

                        我们知道==比较的是对象的引用,那这里为什么会这出这种情况呢?

                        原理

                        首先这是JDK在1.5版本中添加的一项新特性,把-128~127的数字缓存起来了,用于提升性能和节省内存。所以这个范围内的自动装箱(相当于调用valueOf(int i)方法)的数字都会从缓存中获取,返回同一个数字,所以现在你理解为什么了吧。同时这也会给我们开发带来预想不到的陷阱,直得注意!!

                        而我们通过new Integer(1)这样就不会从缓存中获取,大家可以自行测试。

                        我们来翻看下jdk中Integer的源码

                        上面是IntegerCache的源码,把从-128~high放在缓存中

                        上面是valueOf的源码,先从缓存中获取,获取不到再new一个返回

                        从源码里面我们可以看到最小边界是-128,最大边界可以通过-XX:AutoBoxCacheMax进行配置,但也不会大于Integer.MAX_VALUE最大值。

                        IntegerCache的妙用和陷阱的更多相关文章

                        1. IntegerCache的妙用和陷阱!

                          考虑下面的小程序,你认为会输出为什么结果? public class Test {     public static void main(String\[\] args) {         Int ...

                        2. Java成神之路技术整理(长期更新)

                          以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 ...

                        3. 深入浅出 Java 中的包装类

                          前阵子,我们分享了<Java中的基本数据类型转换>这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱.拆箱的概念和原理. 什么是包装类型 Java 设计 ...

                        4. Java成神之路技术整理

                          关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 ...

                        5. 2019 最新 Java 核心技术教程,都在这了!

                          Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 ...

                        6. Java 核心编程技术干货,2019 最新整理版!

                          Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 ...

                        7. Integer装箱拆箱、参数传递

                          拆箱装箱 举个例子 @Test public void testEquals() { int int1 = 12; int int2 = 12; Integer integer1 = new Inte ...

                        8. Class 文件结构及深入字节码指令

                          JVM的无关性 与平台无关性是建立在操作系统上,虚拟机厂商提供了许多可以运行在各种不同平台的虚拟机,它们都可以载入和执行字节码,从而实现程序的“一次编写,到处运行” https://www.oracl ...

                        9. Integer判等的陷阱:你知道Integer内部高速缓冲区IntegerCache吗?

                          https://blog.csdn.net/magician_Code/article/details/51469101 我们先来看看下面代码的运行情况: public static void mai ...

                        随机推荐

                        1. UTM (Urchin Tracking Module) codes

                          UTM Codes are a great way to see the results of your offline marketing In today’s day and age, we ar ...

                        2. kubernetes实战篇之创建密钥自动拉取私服镜像

                          系列目录 前面我们讲解了如何搭建nexus服务器,以及如何使用nexus搭建docker私有镜像仓库,示例中我们都是手动docker login登陆私服,然后通过命令拉取镜像然后运行容器.然而这种做法 ...

                        3. 中转Webshell 绕过安全狗(一)

                          前言 听说中国菜刀里有后门.抓包我是没有监测到异常数据包.为了以防万一,且更好使用中国菜刀硬杠安全狗.笔者收集了一下资料.无耻的copy大佬的源码,只是在大佬的基础上简单修改了一下,达到Webshel ...

                        4. Xshell连接WSL

                          Xshell连接WSL Windows的Windows Subsystem for Linux很好用, 可以直接使用Linux的CLI模式, 对于开发来说很友好. 安装 Windows 10系统上, ...

                        5. 喵星人教你 HTTP 状态码

                          在我们日常 Web 开发中,或多或少的都接触过 HTTP 状态码,那这些状态码代表什么意思呢?熟悉这些状态码又有什么好处呢?下面我就为大家一一道来,可以把本片文章'收藏'以备不时之需. HTTP 状态 ...

                        6. Programming In Lua 第五章

                          1, 2, 3, 4, 5, 6, 7, 8, 9, 第9点非常重点. 10,

                        7. RobotFramework + HTTP接口自动化实现

                          一.          什么是自动化测试? 1.      定义 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程,也可以说是软件测试的一种技术手段. 2.      常见工具 Appium ...

                        8. vue中轮播图的实现

                          <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

                        9. @Bean 注解全解析

                          目录 @Bean 基础声明 @Bean 基本构成及其使用 @Bean 注解与其他注解产生的火花 @Profile 注解 @Scope 注解 @Lazy 注解 @DependsOn 注解 @Primar ...

                        10. nio原理和示例代码

                          我正在为学习大数据打基础中,为了手撸rpc框架,需要懂得nio的原理,在搞懂nio框架前,我会带着大家手撸一些比较底层的代码,当然今后当我们学会了框架,这些繁琐的代码也就不用写了,但是学一学底层的代码 ...