Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。
Byte
,Short
,Integer
,Long
这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character
创建了数值在 [0,127] 范围的缓存数据,Boolean
直接返回 True
or False
。
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(i1==i2);// 输出false
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是缓存中的对象。而Integer i2 = new Integer(40)
会直接创建新的对象。因此,答案是 false
。你答对了吗?
记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
更多消息资讯,请访问昂焱数据。昂焱数据