现在的位置: 首页 > 综合 > 正文

自编java细节(2)

2018年05月11日 ⁄ 综合 ⁄ 共 1142字 ⁄ 字号 评论关闭

我認為這個系列的東西會繼續寫下去的,為了避免成為民工,必須自己學會設計

轉載自 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);
}
}
如果你是认为都会输出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(){}

static final Integer cache[] = new Integer[-(-128+ 127 + 1];

static {
for(int i = 0i < cache.lengthi++)
cache[i] = new Integer(i - 128);
}
}

上面的代码应该能很好的解决问题了,其实就是jdk5之后在Integer的时候都会判断数值是否在范围内,中间缓存了一些数字,这样是可以提高效率的,其实我感觉这个设计还不错,希望JVM以后能够更猛。

抱歉!评论已关闭.