沈阳市建设工程质量检测中心网站,免费网站链接,wordpress 微信登录界面,杭州网页设计new Integer(127)和Integer.valueOf(127)是有区别的#xff1a;理由如下#xff01;
new Integer(127)#xff1a;每次都会创建一个新的对象。Integer.valueOf(127)#xff1a;会使用缓存池中的对象#xff0c;意味着多次调用都是同一个地址。
Integer a1 new Integer(1…new Integer(127)和Integer.valueOf(127)是有区别的理由如下
new Integer(127)每次都会创建一个新的对象。Integer.valueOf(127)会使用缓存池中的对象意味着多次调用都是同一个地址。
Integer a1 new Integer(127);
Integer b1 new Integer(127);
System.out.println(a1 b1); // falseInteger a2 Integer.valueOf(127);
Integer b2 Integer.valueOf(127);
System.out.println(a2 b2); // trueJava8中Integer缓存池的范围是[-128,127]。意味着在这个范围内的数值多次使用都是同一个地址。
Integer.valueOf(int i)的实现
过程首先判断该数是否在缓存池范围内如果在就从缓存池里面取否则重新新建一个对象。
public static Integer valueOf(int i) {if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);
}缓存结构
源码可以看出该缓存池使用一个数组实现的范围在[-128,127]之间都是存缓存的。
private static class IntegerCache {static final int low -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h 127;String integerCacheHighPropValue sun.misc.VM.getSavedProperty(java.lang.Integer.IntegerCache.high);if (integerCacheHighPropValue ! null) {try {int i parseInt(integerCacheHighPropValue);i Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high h;cache new Integer[(high - low) 1];int j low;for(int k 0; k cache.length; k)cache[k] new Integer(j);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high 127;}private IntegerCache() {}
}编译器在自动装箱的过程中首先会调用Integer.valueOf(int i)来创建。如果存在相同值那么就会使用缓存中相同的地址。
Integer a 127;
Integer b 127;
System.out.println(a b);//trueInteger c 128;
Integer d 128;
System.out.println(c d);//false总结
因为特殊性所以在开发中使用该包装类的时候如果是比较两个值是否相等尽量用equals()来比较。