今天在javaeye上看到一兄弟贴的代码,
1: int a = 1000, b = 1000;
2: System.out.println(a == b);
3: Integer c = 1000, d = 1000;
4: System.out.println(c == d);
5: Integer e = 100,h = 100;
6: System.out.println(e == h);
运行程序后,输出的结果是:true false true, 看到这个结果,我是百思不得其解,第三行跟第五行明明初始化的一样,为什么结果不一样呢,于是找答案
原来根据java语言规范,符合规范的Java实现必须保证Integer的缓存至少要覆盖[-128, 127]的范围。
使用Oracle/Sun JDK 6,在server模式下,使用-XX:AutoBoxCacheMax=NNN参数即可将Integer的自动缓存区间设置为[-128,NNN]。注意区间的下界固定在-128不可配置。
在client模式下该参数无效。这个参数是server模式专有的,在c2_globals.hpp中声明,默认值是128;不过这个默认值在默认条件下不起作用,要手动设置它的值或者是开启-XX:+AggressiveOpts参数才起作用。
在设置了-XX:+AggressiveOpts启动参数后,AutoBoxCacheMax的默认值会被修改为20000并且生效
从这里,也就是说在sun jdk的server模式中可以通过设置-XX:AutoBoxCacheMax这个参数来确定Integer自动缓存的大小,然后在client模式中这个参数是不支持的,但是可以通过启用-XX:+AggressiveOpts这个参数来调整Integer的自动缓存大小,可调整到20000,请看下面JVM实现代码:
// Aggressive optimization flags -XX:+AggressiveOpts
void Arguments::set_aggressive_opts_flags() {
#ifdef COMPILER2
if (AggressiveOpts || !FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
if (FLAG_IS_DEFAULT(EliminateAutoBox)) {
FLAG_SET_DEFAULT(EliminateAutoBox, true);
}
if (FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
FLAG_SET_DEFAULT(AutoBoxCacheMax, 20000);
}
// Feed the cache size setting into the JDK
char buffer[1024];
sprintf(buffer, "java.lang.Integer.IntegerCache.high=" INTX_FORMAT, AutoBoxCacheMax);
add_property(buffer);
}
// ...
#endif
}
然后再回到代码本身,Integer e = 100,h = 100; 这里编译器会自动帮我们进行box操作,所谓自动装箱即会调用Integer.valueOf(int)方法,
同时这个值100有事在缓存区域内,所以会直接读取缓存的内容;不过Integer c = 1000, d = 1000; 1000是大于Integer的默认缓存范围的,所以c d是不相等的。
同时也可以测试:Integer e = 100 ,f = Integer.valueOf(100), 可以发现 e == f也会打印true,
但是 Integer h = 100, g = new Integer(100); g是新建了一个Integer对象, 所以h g是不相等的。
分享到:
相关推荐
1. **初始化**:`IntegerCache` 在类加载时初始化,通过一个静态代码块来设置 `high` 值,这个值可以通过系统属性 "java.lang.Integer.IntegerCache.high" 来配置,默认值是127。`low` 值始终为-128。 2. **缓存...
在Java编程中,Integer类是int类型的一个包装类,提供了许多便利的方法。...在Java 9及更高版本中,虽然没有提供直接修改IntegerCache的官方途径,但可以通过理解和利用其机制来优化代码,特别是在处理大量整数对象时。
if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` ##### 其他包装类的常量池实现 其他包装类如`Short`、`Byte`、`...
对象池在`Integer`类中以内部类`IntegerCache`的形式存在,它是一个预先创建的`Integer`对象数组,数组长度为256,范围从-128到127。 这个对象池的存在是因为对于小整数(-128到127之间),`Integer`对象通常会被...
在Java编程语言中,面试时常会遇到关于Integer与int之间区别的问题,这些问题是考察开发者对数据类型、内存管理和自动装箱拆箱的理解。本文将深入解析这些知识点,帮助你避免在面试中踩坑。 首先,Java有两类数据...
if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` 总结来说,Java的基础知识涵盖了许多方面,从基本数据类型到封装类...
如果想要改变这个范围,可以通过设置JVM参数`-XX:+AggressiveOpts`来提高IntegerCache.high的值,但IntegerCache.low不能被修改,这意味着小于-128的整数无法直接利用缓存的Integer对象。 Java编译器还负责其他优化...
IntegerCache是一个数组,用于存储从-128到127(包括两端)的Integer对象。当调用`valueOf(int i)`时,会首先检查这个范围,如果在范围内,就直接从缓存中获取或插入对象;如果不在范围内,将通过`new Integer(i)`...
根据给定文件的信息,我们可以详细地探讨一下关于如何利用VHDL实现CACHE的基本功能及其相关技术要点。 ### CACHE的基本概念 CACHE是一种高速缓存存储器,位于CPU与主内存之间,用于提高系统的运行效率。其主要目的...
IntegerCache是Integer类的一个私有静态内部类,它维护了一个-128到127的Integer对象数组。这个缓存大小可以通过JVM的启动参数`-Djava.lang.Integer.IntegerCache.high`来调整。默认值是127,但可以通过设置这个参数...
这是因为Integer类内部有一个缓存池,即IntegerCache,它预先创建了-128到127之间的所有Integer对象。当我们调用valueOf()方法时,如果值在这个范围内,就会从缓存池中获取对象,而不是每次都new一个新的对象。例如...
### 正则表达式 #### 正则表达式概述 正则表达式是一种强大的文本处理工具,能够帮助程序员实现对字符串的有效验证与处理。...通过对正则表达式和IntegerCache的理解与应用,可以提高程序的效率和可维护性。
2.2 Integer Representations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.2.1 IntegralDataTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
当使用 `==` 操作符进行比较时,由于这两个对象的值都在-128到127之间,根据`Integer` 类中的缓存机制(`IntegerCache`),这些值会被缓存起来,从而使得 `c` 和 `d` 实际上指向了同一个对象,因此返回 `true`。...
- 缓存机制涉及到IntegerCache类,该类内部维护了一个缓存数组,用于存储-128到127(包含边界值)之间的整数值。 - 当自动装箱的值在这个范围之内时,将直接返回缓存中的Integer对象,而不是创建一个新的对象,...
此外,初始化时,还可以通过设置系统属性`java.lang.Integer.IntegerCache.high`来改变这个值,但这通常需要对JVM有较深的理解。 了解这个知识点对于Java开发者来说至关重要,尤其是在面试或编写高性能代码时。虽然...
`IntegerCache`类是`Integer`类的一个静态内部类,它的作用就是实现上述的缓存功能。这个类在类加载时初始化,创建-128到127之间的`Integer`对象,并将它们存储在一个数组`cache`中。当调用`valueOf(int i)`方法时,...
如果需要调整这个范围,可以通过JVM启动参数`-Djava.lang.Integer.IntegerCache.high`设置,但必须保证不超过Integer的最大值(即`Integer.MAX_VALUE`)。 在实际开发中,理解拆装箱和Integer对象的缓存机制是非常...
这是因为Integer类中有一个私有的静态内部类IntegerCache,它缓存了这些预定义的Integer对象。当创建一个新的Integer对象且其值在这个范围内时,JVM会直接从缓存池中获取,而不是在堆上新建。可以通过JVM启动参数来...