说说下面代码的输出:
Integer a1 = 10, b1 = 128;
Integer a2 = 10, b2 = 128;
Integer a3 = new Integer(10);
Integer b3 = new Integer(128);
System.out.println(a1==a2);//true
System.out.println(a1==a3);//false
System.out.println(b1==b2);//false
System.out.println(b1==b3);//false
上述代码详解
Integer为引用对象,那么两个Integer对象使用”==”比较的就是空间地址,如果a1==a2那就说明a1与a2的空间地址是相同的,为什么会相同呢?b1与b2的空间地址又为什么不相同了呢?
实际上对于第一与第二行代码,java在编译期做了优化,实际上执行的代码如下
Integer a1 = = Integer.valueOf(10);
那么为什么使用valueOf方法创建Integer对象时a1与a2的空间地址是相同的而b1与b2的空间地址又不同了呢?下图为valueOf方法的源码
从图中可以看到对不同的值会采用不同的创建方式,这一切似乎都与IntegerCache这个对象有关,cache为缓存的意思,不难猜出如果符合if中的条件则从缓存中获取一个对象,不符合则会new一个对象.下面进入到类IntegerCache中看看.注释为后来添加
private static class IntegerCache {
//IntegerCache.low的值为-128,被final修饰表示必须赋值且赋值后便不可再次更改
static final int low = -128;
//high值虽也被final修饰但并未赋初值,意味着要在后面赋初值
static final int high;
//用来存储缓存的Integer对象
static final Integer cache[];
static {
int h = 127;
//从虚拟机配置中获取配置"java.lang.Integer.IntegerCache.high"的值,可以自己修改虚拟机配置,默认没有该条配置
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
//将获取的String配置值转为int
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
//配置的值若超过int类型能表示的最大值,肯定是不行的,同时也是因为缓存的对象都是存在了数组中而数组的大小也是有上线的,超过数组最大上限就缓存不下了
h = 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 = 127;
}
private IntegerCache() {}
}
综上可以看出在不修改虚拟机配置的情况下,Integer会在第一次调用valueOf方法时将-128与127的Integer对象进行缓存.所有使用valueOf获取的Integer对象若在范围-128~127则都为缓存中的同一对象,而不在范围内的值则会重新new一个Integer对象.回过头再看看开始的代码输出,是否跟预想的结果一致了呢
若想比较Integer与Integer的大小,使用equals比较即可
再来看看下面代码的输出
Integer a1 = new Integer(100);
int a2 = 100;
Integer a3 = new Integer(100);
//当一个基本类型和一个包装类型比较时,包装类型会被自动拆包进行比较
System.out.println(a1 == a2);//true
//equals方法内部调用了intValue方法,该方法会返回Integer对象中使用int修饰的value值,这个过程就是所谓的拆包
System.out.println(a1 == a3);//false
System.out.println(a1.equals(a3));//true
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
卷轴模式的定义介绍? 新用户注册,先送用户一部分购物积分,该积分用于兑换一个初始任务,俗称卷轴任务,卷轴模式的基本的原理是,会员用积分兑换卷轴卷轴,完成卷轴任务之后,你可以获得更多的购物积分。同时会员可以用积分参与更高级的卷轴任务,同样,当完成这些任务后,用户…