面试题答案
一键面试Integer类的缓存机制原理
Java中的Integer
类缓存机制是基于享元模式实现的。当通过valueOf(int i)
方法获取Integer
对象时,如果传入的值在缓存范围内,会直接返回缓存中的对象,而不是创建新的Integer
对象。这是因为Integer
类内部维护了一个IntegerCache
静态内部类,该类在类加载时就创建并初始化了一个Integer
数组来缓存一定范围内的Integer
对象。
缓存范围
默认情况下,Integer
类的缓存范围是 -128 到 127。这个范围可以通过-Djava.lang.Integer.IntegerCache.high
系统属性来调整上限,但下限始终是 -128。
使用场景
- 频繁使用小整数对象:在程序中频繁创建表示小整数的
Integer
对象时,如循环中使用Integer
作为计数器,缓存机制可以减少对象创建开销,提高性能和节省内存。例如:
for (int i = 0; i < 100; i++) {
Integer integer = Integer.valueOf(i);
// 这里的integer对象如果在缓存范围内,会复用缓存对象
}
- 对象比较:由于缓存范围内的
Integer
对象是同一个实例,在进行==
比较时,如果值在缓存范围内,可以利用这一特性判断两个Integer
对象是否为同一实例,而不仅仅是值相等。但要注意,使用equals
方法比较值才是更通用和安全的方式。例如:
Integer a = Integer.valueOf(10);
Integer b = Integer.valueOf(10);
System.out.println(a == b); // true,因为10在缓存范围内,a和b是同一个对象