Integer包装类包箱拆箱小秘密?
来源:互联网 发布:淘宝零食店推荐 编辑:程序博客网 时间:2024/05/16 05:43
问题1:
Integer i1 = 127;Integer i2 = 127;System.out.println(i1 == i2); //true分析:
After compiling,This statement(Integer i1 = 127; ) is turned into Integer b = Integer.valueOf(127); 也就是说,经编译器编译后,Integer i1 = 127;这个语句相当于Integer b = Integer.valueOf(127);也就是所谓的“包箱”过程。那为什么结果还是true呢?不是对比两个地址吗?没错,是对比两个地址,答案就出在Integer.valueOf(int)方法,请看。
public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
真相大白,原来Integer类中的内部类帮我们缓存了一个Integer类型的数组(没想到吧,醉醉),这个数组的范围默认是-128至127(其中最小值-128是固定的,最大值127是默认的,可以通过虚拟机的配置而改变其大小)。因为127在缓存范围内,所以,i1 == i2其实是两个相同的引用值。
问题2:
Integer i1 = 128;Integer i2 = 128;System.out.println(i1 == i2); //false
分析:
由问题1可知Integer i1 = 128;先将i1“包箱”;又因为128超出缓存范围,valueOf方法各自new Integer(128),所以i1 == i2是两个不同的引用值,结果为false.
问题3:
Integer i1 = 128;int i2 = 128;System.out.println(i1 == i2); //true分析:
首先Integer i1 = 128;先将i1“包箱”,执行i1 == i2(Integer类参与算术运算时),i1会被“拆箱”,虚拟机会调用Integer类的intValue方法将其转换为int型,所以i1==i2 等价于128 == 128
总结:
将一个int常量赋值给Integer类,虚拟机调用valueOf方法包装它,将int变成一个Integer型,即“包箱”,并且会返回相应的缓存值,默认范围是-128-127
用Integer类做算术运算,虚拟机会调用intValue拆开它将Integer变成一个int常量,即“拆箱”
0 0
- Integer包装类包箱拆箱小秘密?
- Integer包装类
- Integer包装类
- Integer包装类
- JAVA 包装类中的Integer
- Java包装类Integer比较
- JAVA API 包装类 Integer
- Integer包装类常用方法
- java入门包装类-Integer
- Integer包装类的坑
- java包装类的实例化秘密
- Integer类(包装类)的缓存
- Integer 包装类句柄的隐形变化
- JAVA包装类Integer的使用
- JAVA之包装类Integer详解
- java包装类——Integer
- 基本数据类型对象包装类Integer parseXxx
- 基本数据类型对象包装类-Integer
- JS创建类和对象
- 完整ASCII字符表(转)
- POJ 2449 Remmarguts' Date K短路
- jquery事件重复绑定解决办法
- jQuery.extend 函数详解
- Integer包装类包箱拆箱小秘密?
- mysqli_query和mysql_query有何区…
- mysqli->multi_query()多条语句的…
- JSON 数据格式
- 【转】PHP,不得不转的一篇PHP使用…
- 有关JSON以及JSON在PHP中的应用
- UI动画架构(上下滚动,里面View可以实现动画<透明,移动,缩放,变色>l)
- PHP session的详细分析
- SQL 连接 JOIN 例…