
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。Byte,Short,Integer,Long这 4 种包装类默认创建了数值[-128127]的相应类型的缓存数据Character创建了数值在[0,127]范围的缓存数据Boolean直接返回TrueorFalse。Integer 缓存源码public static Integer valueOf(int i) { if (i IntegerCache.low i IntegerCache.high) return IntegerCache.cache[i (-IntegerCache.low)]; return new Integer(i); } private static class IntegerCache { static final int low -128; static final int high; static { // high value may be configured by property int h 127; } }Character缓存源码:public static Character valueOf(char c) { if (c 127) { // must cache return CharacterCache.cache[(int)c]; } return new Character(c); } private static class CharacterCache { private CharacterCache(){} static final Character cache[] new Character[127 1]; static { for (int i 0; i cache.length; i) cache[i] new Character((char)i); } }Boolean缓存源码public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }如果超出对应范围仍然会去创建新的对象缓存的范围区间的大小只是在性能和资源之间的权衡。两种浮点数类型的包装类Float,Double并没有实现缓存机制。Integer i1 33; Integer i2 33; System.out.println(i1 i2);// 输出 true Float i11 333f; Float i22 333f; System.out.println(i11 i22);// 输出 false Double i3 1.2; Double i4 1.2; System.out.println(i3 i4);// 输出 false下面我们来看一个问题下面的代码的输出结果是true还是false呢Integer i1 40; Integer i2 new Integer(40); System.out.println(i1i2);// 输出falseInteger i140这一行代码会发生装箱也就是说这行代码等价于Integer i1Integer.valueOf(40)。因此i1直接使用的是缓存中的对象。而Integer i2 new Integer(40)会直接创建新的对象。因此答案是false。你答对了吗记住所有整型包装类对象之间值的比较全部使用 equals 方法比较。