Integer包装类源码分析

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习!

今天上班的途中在手机里看到几道关于Integer拆装箱的小题目,正好有点时间翻看了一下Integer类的源码,加上自己的一点思考,决定写点东西。

先来看看下面的代码:

如果这道题你能得出正确答案并了解其中的原理,说明你的基础还可以。如果你的答案是true和true的话,建议你去看看书。

程序运行结果:

我们知道==比较的是两个对象的引用,这里a、b、c、d都是新建出来的对象,按道理都应该输出false才对, 想知道其中的原理,我们去看看Integer.java这个类的源码就知道了。

当我们声明Integer c = 10;的时候,此时会进行自动装箱操作,简单的说,也就是把基本数据类型转换成Integer对象,而把int型转换成Integer对象正是调用的valueOf(int i)方法。从上面的源码中可以看出,Integer中把-128--127这256个数据缓存了下来。官方的说法是这些小的数字使用的频率比较高,为了优化性能,就把这之间的数缓存了下来。这就是为什么输出结果是false和true了。当声明的Inetger对象的值在-128--127之间时,引用的是缓存中的同一个对象(可以看作常量池),所以结果是true;当声明的Integer对象的值不在这个范围之类的时候,就会通过new Integer(i);语句创建一个Integer对象。

我们再来看下面这段代码:

如果这道题你能很快给出正确答案,那么==比较符你就掌握的比较透彻了。公布答案:

看到这个答案,小伙伴们可能又会不解,上面不是说Integer把-128--127缓存起来了吗,这个不应该是true吗?但是你仔细看,这里的Integer对象是我们自己new出来的,并不是用缓存,所以结果是false。那第一个为啥又是true呢?首先这里b的值为1000,肯定跟我们所知的Integer缓存没关系,既然和缓存没有关系,a是我们new出来的对象,那应该输出false才对呀?注意这里b是int型,当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转为int型,所以这里进行比较的是int型的值,因此结果为true。

好了,经过以上分析,相信小伙伴们对Integer包装类理解的更深了吧,记住一点,有疑问的时候能看源码的尽量看源码,还有什么比源码给出的回答更准确呢?

时间: 2024-07-28 15:36:49

Integer包装类源码分析的相关文章

Integer面试连环炮以及源码分析

场景: ??昨天有位朋友去面试,我问他面试问了哪些问题,其中问了Integer相关的问题,以下就是面试官问的问题,还有一些是我对此做了扩展. 问:两个new Integer 128相等吗? 答:不.因为Integer缓存池默认是-127-128: 问:可以修改Integer缓存池范围吗?如何修改? 答:可以.使用-Djava.lang.Integer.IntegerCache.high=300设置Integer缓存池大小 问:Integer缓存机制使用了哪种设计模式? 答:亨元模式: 问:Int

JDK源码分析-Integer

Integer是平时开发中最常用的类之一,但是如果没有研究过源码很多特性和坑可能就不知道,下面深入源码来分析一下Integer的设计和实现. Integer: 继承结构: -java.lang.Object --java.lang.Number ---java.lang.Integer 其中父类Number是个抽象类,是所有数字类型相关的类的父类,例如Double.Float.Integer.Long 和 Short. Integer类还实现了Comparable接口用以比较两个Integer的

MyBatis源码分析-SQL语句执行的完整流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

MyBatis 源码分析 - 配置文件解析过程

* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上.下面,我们来一起看一下本篇文章的目录结构. 从目录上可以看出,2.3节.2.5节和2.8节的内容比较多.其中2.3节是关于settings配置解析过程的分析,除了对常规的 XML 解析过程分析,本节额外的分析了元

Spring IOC 容器源码分析

前言: Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题. 阅读建议:读者至少需要知道怎么配置 Spring,了解 Spring 中的各种概念,少部分内容我还假设读者使用过 SpringMVC.本文要说的 IOC

zuul源码分析-探究原生zuul的工作原理

前提 最近在项目中使用了SpringCloud,基于zuul搭建了一个提供加解密.鉴权等功能的网关服务.鉴于之前没怎么使用过Zuul,于是顺便仔细阅读了它的源码.实际上,zuul原来提供的功能是很单一的:通过一个统一的Servlet入口(ZuulServlet,或者Filter入口,使用ZuulServletFilter)拦截所有的请求,然后通过内建的com.netflix.zuul.IZuulFilter链对请求做拦截和过滤处理.ZuulFilter和javax.servlet.Filter的

Dubbo 源码分析 - 集群容错之 LoadBalance

1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载.在为高负载的服务器分流的同时,还可以避免资源浪费,一举两得.负载均衡可分为软件负载均衡和硬件负载均衡.在我们日常开发中,一般很难接触到硬件负载均衡.但软件负载均衡还是能够接触到一些的,比如 Nginx.在 Dubbo 中,也有负载均衡的概念和相应的实现

Mybatis源码分析

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

2、JDK8中的HashMap实现原理及源码分析

本篇提纲.png 本篇所述源码基于JDK1.8.0_121 在写上一篇线性表的文章的时候,笔者看的是Android源码中support24中的Java代码,当时发现这个ArrayList和LinkedList的源码和Java官方的没有什么区别,然而在阅读HashMap源码的时候,却发现Android中的Java与官方版的出入略大,遂不得不转而用Eclipse导入jdk源码阅读,这里不得不吐槽一句,用惯了IDEA的快捷键,Eclispe还真是用不习惯~~好了,接下来我们言归正传: 一.什么是Has