Integer自动装箱、自动拆箱
来源:互联网 发布:阿里云 可用区a 编辑:程序博客网 时间:2024/06/11 11:06
//代码段1 Integer i1=200; Integer j1=200; System.out.println(i1==j1);//代码段2 Integer i2=100; Integer j2=100; System.out.println(i2==j2);复制代码这两段代码的结果分别是多少?JDK1.6上执行代码段1的结果为false,代码段2的结果为true.实验1:在JDK1.4下代码段1不能编译通过的,会提示:“ Type mismatch: cannot convert from int to Integer”的错误,改写为:“Integer i1 = new Integer(200); Integer j1 = new Integer(200);”,编译正常。两段代码运行结果为false,true,代码段1由于是对象使用==比较,比较的是两个对象的地址,所以为false(这个大家都应该明白了)。实验2: 在JDK1.5下代码段1可以编译通过,因为其实现了自动装箱(Autoboxing)和自动拆箱(Auto-Unboxing)。两段代码运行结果为false,true从实验2就可以看出,问题出在了装箱/拆箱过程,通过反编译,找出Integer赋值调用的是Integer.valueOf方法,查JDK源代码,如下所示:public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); } jdk1.8中改进为: 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); }看到这里,我想大家都应该明白为什么会是false了。原来在装箱时,将-128<=i1<=127范围之内的数据打包成缓存里的Integer对象了,由于不用new,所以这个区间里的值用直接=赋值方法得到的变量地址就是同一个,而超出这个范围的数值就会new一个Integer对象出来,用==运行符来计算,怎么也不可能为true。
0 0
- Integer自动装箱拆箱
- Integer自动拆箱、自动装箱
- Integer自动装箱、自动拆箱
- int Integer 装箱 拆箱 自动装箱 自动拆箱
- Integer的自动拆箱装箱陷阱
- Integer的自动装箱与拆箱
- Integer自动拆箱与自动装箱的注意事项
- Integer类自动装箱、拆箱与享元模式
- 关于Integer自动装箱和拆箱的小知识
- 巧记Integer int 自动装箱与拆箱
- Integer.valueOf(int i)与自动拆箱与装箱
- integer自动装箱拆箱&String内存分配测试
- 关于自动装箱 与自动 和自动拆箱。Integer,Boolean等
- 自动拆箱自动装箱
- 自动装箱自动拆箱
- 自动装箱拆箱
- 自动拆箱,装箱
- 自动装箱拆箱
- Android 启动adb失败的解决方法
- 操作系统内存管理——分区、页式、段式管理
- Linux 定时任务
- 今日学习——基础程序
- 'keytool' 不是内部或外部命令,也不是可运行的程序
- Integer自动装箱、自动拆箱
- pip安装使用详解
- android 字符串得到分割
- CSS学习笔记:transition、transform、animation
- led平台驱动
- MySQL C API造成内存泄漏
- LinkedList总结
- 欢迎使用CSDN-markdown编辑器
- 16. Linux常用命令