Java中Integer自动装箱误区
来源:互联网 发布:淘宝网芮玛 编辑:程序博客网 时间:2024/05/29 19:33
偶然间接到一段代码:
public class TestInteger {public static void main(String[] args) {Integer i = 100, j = 100;if (i == j) {System.out.println("i == j");} else {System.out.println("i != j");}}}结果可想而知:输出的是i == j; But 请看下文!
public class TestInteger {public static void main(String[] args) {Integer i = 200, j = 200;if (i == j) {System.out.println("i == j");} else {System.out.println("i != j");}}}
这只是单纯的增大了i和j的值,结果却不一样。输出的是 i != j , 回想一下自动装箱,== 运算符可以判断基本类型是否相等,我开始怀疑是否当i = 200, j = 200,时是否产生了不同的对象。查阅jdk的源代码真的有所发现:
/** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Integer} instance is not * required, this method should generally be used in preference to * the constructor {@link #Integer(int)}, as this method is likely * to yield significantly better space and time performance by * caching frequently requested values. * * This method will always cache values in the range -128 to 127, * inclusive, and may cache other values outside of this range. * * @param i an {@code int} value. * @return an {@code Integer} instance representing {@code i}. * @since 1.5 */ public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
综合代码和注释:这个方法会缓存 -128 到 127的值,但是超过这个范围会返回一个 Integer 对象。 还有一个疑问的是 这个IntegerCache,看名字是说整数类缓存,调用里面的静态数组然后返回。再次找到代码:
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
这就不难理解了, Java原来是会自动缓存 -128 - 127 的数值之内的数组,方便快速取值。但是这个最大的值在不同平台上不一样。
综上所述: 当数值在-128和127之间时,产生的值是获得内部的缓存。当数值不在之类的时候,返回的是一个类,而且还不会自动拆箱。
0 0
- Java中Integer自动装箱误区
- java自动装箱之Integer
- Java中Integer的运算,自动装箱机制
- Java中Integer类的自动装箱和自动拆箱
- java自动装箱、拆箱——Integer细节
- 研究Integer的自动装箱
- Integer的自动装箱过程
- Integer自动装箱拆箱
- Integer对象自动装箱问题
- Integer自动装箱细节分析
- Integer自动装箱的细节
- Integer自动装箱和Integer.valueOf()
- java中 interger自动装箱拆箱
- Java中自动装箱代码初探
- java中自动装箱与拆箱
- Integer自动拆箱、自动装箱
- Integer自动装箱、自动拆箱
- int Integer 装箱 拆箱 自动装箱 自动拆箱
- Mysql优化之开山篇
- 【u226】查单词
- Unity和Android的关系
- EL表达式
- 切割csv文件
- Java中Integer自动装箱误区
- 欢迎使用CSDN-markdown编辑器
- IndexOf和replace用法
- 即时通讯实现思路
- Python 01:Pyton历史和入门介绍
- Android第三周-自定义控件、Fragment、Hadler、Service、BroadcastReceive、webview、widget
- 游戏开发注意事项
- 数据转接
- indexOf() 用法