包装类的缓存机制
这个缓存机制或许是很多人都没有注意到的一个点,有时候一不小心就会出错,出错了你或许都不知道错在哪里。
该机制的引入是为了提升性能并减少内存的使用,因为包装类相对基本类型来说,多了垃圾回收,内存分配等,性能相对较低。
缓存机制就是让各个包装类在一定大小范围内,不直接创建新的对象,而是直接从缓存中缓存中获取对象,而这里的缓存中的对象是JVM在类加载的时候就已经创建好了。
因为该机制,有时候两个相同数值的包装类的对象也有可能是相等的,不能惯性的认为类的不同对象不可能相等,我之前写力扣就是踩的这个坑,怎么找等没从这个上面去考虑。
下面举一个例子
public class IntegerCacheExample {public static void main(String[] args) {Integer a = Integer.valueOf(100);Integer b = Integer.valueOf(100);// 输出 true,因为 100 在缓存范围内,a 和 b 引用同一个对象System.out.println(a == b); Integer c = Integer.valueOf(200);Integer d = Integer.valueOf(200);// 输出 false,因为 200 不在缓存范围内,c 和 d 是不同的对象System.out.println(c == d); }
}
最后缓存的范围到底是多少呢,下面吧常见的列举一下
Integer ,Byte,Long,Short:-128 ~127
Character:ASCII中的0~127
Boolean单独讲一下,因为他不存在数值的范围的概念
如果使用Boolean.valueOf()来构造对象,只要都是true或false,那么这两个对象就是一样的
如果是用的new Boolean()那么就不是一样的了
举个例子理解一下
public class BooleanValueOfComparison {public static void main(String[] args) {Boolean bool1 = Boolean.valueOf(true);Boolean bool2 = Boolean.valueOf(true);// 输出 true,因为引用同一个 Boolean.TRUE 对象System.out.println(bool1 == bool2); Boolean bool3 = Boolean.valueOf(false);Boolean bool4 = Boolean.valueOf(false);// 输出 true,因为引用同一个 Boolean.FALSE 对象System.out.println(bool3 == bool4); Boolean bool1 = new Boolean(true);Boolean bool2 = new Boolean(true);// 输出 false,因为是不同的对象实例System.out.println(bool1 == bool2); Boolean bool3 = new Boolean(false);Boolean bool4 = new Boolean(false);// 输出 false,因为是不同的对象实例System.out.println(bool3 == bool4); }
}
再提一嘴,Double没有缓存机制