我認為這個系列的東西會繼續寫下去的,為了避免成為民工,必須自己學會設計
轉載自 http://youngershen.com/blog
<1>. Integer类的特殊之处
我也认为这是java很细节的地方,而且就连这么简单的Integer包装类也用到了很厉害的工程学模式,而且还有一些小聪明在里面,如果真的不知道原理的话看起来确实是非常的费解,先看下面一段代码吧。
public class TestInteger {
public static void main(String[] args) {
Integer i1 = 123;
Integer i2 = 123;
System.out.println(i1 == i2);Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
}
}
Integer i1 = 123;
Integer i2 = 123;
System.out.println(i1 == i2);Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
}
}
如果你是认为都会输出true的话,那么这样也没什么大不了的,如果你认为第一个是true,第二个是false的话可能你对Integer理解的稍微深刻一点,但是也不一定你就知道这里面的玄机。
结果是前面的是true,后面的是false , 这点是为什么呢?有些人可能知道Integer的范围是
范围在-2147483648 到2147483648 ,而且123和128也确实都在范围之内,而且他们都是不相同的对象,但是为什么123的就能输出true,128的就输出false呢?
究其原因就是 i3和i4其本身不同的对象,在jdk1.5以后可以看到下面的代码,Integer在赋值的时候都是通过valueOf进行的,而且其中用到了缓存技术
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { //
must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}private static class IntegerCache {
private IntegerCache(){}
if (i >= -128 && i <= 127) { //
must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
上面的代码应该能很好的解决问题了,其实就是jdk5之后在Integer的时候都会判断数值是否在范围内,中间缓存了一些数字,这样是可以提高效率的,其实我感觉这个设计还不错,希望JVM以后能够更猛。