package com.zfsoft.test;
public class TEST {
public static void main(String[] args) {
//比较两个int类型值的大小
compareInt();
System.out.println();
//比较两个INTEGER类型值的大小
compareInteger();
System.out.println();
//引用类型INTEGER和基本类型int比较大小
compareIntegerAndInt();
}
public static boolean compareInt() {
int a =1000;
int b =1000;
System.out.print(a ==b);
return a ==b ;
}
public static boolean compareInteger() {
Integer a =1000;
Integer b =1000;
System.out.print("equals比较大小=="+a.equals(b));
System.out.println();
System.out.print("等号比较大小======"+(a==b));
return a==b ;
}
public static boolean compareIntegerAndInt() {
Integer a =1000;
int b =1000;
System.out.print(a==b);
return a==b ;
}
}
运行结果:
总结:
1.引用类型INTEGER比较 变量值超过127,用==比较是不相等的,但是用equals比较是相等的。
2.引用类型INTEGER比较 变量值不超过127,用==比较是相等的,用equals比较也是相等的。
3.此处用到了集合自动装箱,把int类型的1000,通过内部程序自动调用Integer类里面的public static Integer valueOf(int i)方法装换成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 final Integer cache[];
static {
// high value may be configured by property
int 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_VALUE
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 < 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规定的使用缓存范围是-128~127之间,因此1000明显不在这个范围之内,所以每次自动装箱都会重新创建一个新的对象,每次都是一个新的地址,这也就解释了a !=b的正确性