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包装类理解的更深了吧,记住一点,有疑问的时候能看源码的尽量看源码,还有什么比源码给出的回答更准确呢?
Integer包装类源码分析的更多相关文章
- 设计模式(十二)——享元模式(Integer缓冲池源码分析)
1 展示网站项目需求 小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 1) 有客户要求以新闻的形式发布 2) 有客户人要 ...
- Integer.valueOf源码分析
1. 引言 在牛客网上看到这样一道题目,判断一下打印的结果 public static void main(String[] args){ Integer i1 = 128; Integer i2 = ...
- Integer面试连环炮以及源码分析
场景: 昨天有位朋友去面试,我问他面试问了哪些问题,其中问了Integer相关的问题,以下就是面试官问的问题,还有一些是我对此做了扩展. 问:两个new Integer 128相等吗? 答:不.因 ...
- Integer面试连环炮以及源码分析(转)
场景: 昨天有位朋友去面试,我问他面试问了哪些问题,其中问了Integer相关的问题,以下就是面试官问的问题,还有一些是我对此做了扩展. 问:两个new Integer 128相等吗? 答:不.因 ...
- JDK源码分析-Integer
Integer是平时开发中最常用的类之一,但是如果没有研究过源码很多特性和坑可能就不知道,下面深入源码来分析一下Integer的设计和实现. Integer: 继承结构: -java.lang.Obj ...
- MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- Java-Integer源码分析
除了两种浮点型,剩下的几种基本数据类型的包装类几乎都实现了常量池,有好处用数据的时候直接去拿,没有再去创建,坏处是在程序编译的时候就存入大量数据不管用不用到.下面是一篇很好的文章,很详细,转自:htt ...
- netty : NioEventLoopGroup 源码分析
NioEventLoopGroup 源码分析 1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限.为了方便 IDE 查看.跟踪.调试 代码,所以在 github ...
- Java源码分析:关于 HashMap 1.8 的重大更新(转载)
http://blog.csdn.net/carson_ho/article/details/79373134 前言 HashMap 在 Java 和 Android 开发中非常常见 而HashMap ...
随机推荐
- python——数字问题之_ 变量
在交互模式中,最后被输出的表达式结果被赋值给变量 _ ._ 变量应被用户视为只读变量 >>> a=12/2.3 >>> b=1.2 >>> a*b ...
- linux安装jdk8
1.文件准备 jdk-8u201-linux-x64.tar.gz 下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...
- Django之Auth模块 实现登录,退出,自带session 与认证功能的一个重要的模块
Auth模板 1. 什么是Auth模块,有什么用? django的auth的模块的使用: auth 是集合注册,登录,注销,session 多个功能集合在一起的模块 2. 使用Auth组件的默认aut ...
- js:作用域总结1
先说几个概念: 1.js代码从上往下执行 2.变量提升: 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window,window分两个模块,一个叫内存模块,一个叫运行 ...
- 最适合入门的Laravel中级教程(二)用户认证
之前的初级教程主要是学习简单的增删改查: 接着的中级教程的目标是在初级教程的基础上能写出更复杂更健壮的程序: 我们先来学习 laravel 的用户认证功能: 在现代网站中基本都有用户系统: 而我们每开 ...
- ArcGIS自定义工具箱-字段值部分替换
ArcGIS自定义工具箱-字段值部分替换 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:替换某个字段中的字符串 用例:湖南省长沙市=>湖南/长沙:临湘县 ...
- dto vo
不过符合规矩的做法是DTO里可以放各种List<VO>,而VO和entity就是一一对应的关系,vo里不能放entity,entity里也不能放vo,vo和entity只存放和数据库完全相 ...
- easyui - 标签属性顺序要对 否则options 错误
标签属性顺序要对 否则options 错误
- 定时任务 spring @Scheduled注解
使用spring @Scheduled注解执行定时任务: 运行!!! 关于Cron表达式(转载) 表达式网站生成: http://cron.qqe2.com/ 直接点击 cronExpression ...
- EOS 权限
[EOS权限] 1.查看权限 cleos get account $(Account_Name) 2.使用 cleos set account permission 命令来修改权限 可以看到,owne ...