Integer 和 Integer 的比较
对于Integer和Integer的 == (比较的是地址),我们注重几点:
- 在Integer中有一个静态的内部类IntegerCache,里面有一个cache[], 也就是Integer常量池,常量池缓存的大小为[-128 ~ 127]
- 当我们赋值的数字在这个范围内时,不需要创建新的对象,而是从缓存中获取已经创建好的Integer对象
- 当超出这个范围时,直接new Integer来创建Integer对象
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* jdk.internal.misc.VM class.
*/
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 =
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() {}
}
如果比较使用的是equals(),则比较的是数值
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer 和 int 的比较
对于Integer和int的 == (比较的是数值),我们注重几点:
对于创建Integer来说,有两种方法:
一种是Integer in1 = 10; 等同于 Integer in1 = Integer.valueOf (10) 自动装箱
另一种是Integer in4 = new Integer(10); 装箱
不论哪一种方法,只要与int类型进行比较,那么 == 就会使Interger拆包成int类型,就是相等的。
关于拆箱:
int b1 = in1; 自动拆箱
int b2 = in1.intValue(); 拆箱
关于自动装箱:static进行加载,将int转化为Integer进行装箱
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
关于自动拆箱:
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer b=new Integer(3); //b为Integer的对象
int a=b; //a为一个int的基本数据类型
System.out.println(a); //打印输出3。
}
int a=b,很奇怪,怎么把一个对象赋给了一个基本类型呢?其实 int a = b,这段代码等价于:int a=b.intValue(),来看看 inValue() 方法到底是什么,下面是源码:
public int intValue() {
return value;
}
这个方法很简单嘛,就是返回了value值,然而value又是什么,继续找到了一个代码:
public Integer(int value) {
this.value = value;
}
原来value,就是定义 Integer b=new Integer(3) ; 赋的值。所以上面的代码其实是这样的:
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer b=new Integer(3); //b为Integer的对象
int a=b.intValue();
//其中b.intValue()返回实例化b时构造函数new Integer(3);赋的值3。
System.out.println(a); //打印输出3。
}
int 和 int 的比较
直接比较数值即可
、
int i = 10;
int i0 = 10; // 栈上
Integer in1 = 10; // 由于直接赋值的时候会进行自动的装箱(装包)
Integer in2 = 10;
Integer in3 = new Integer(10);// 堆上且开辟了一个新的空间地址
Integer in4 = new Integer(10);
Integer in5 = 199;
Integer in6 = 199;
// Integer 与 Integer 比较的是地址
// int 和 int 比较的是数值
System.out.println(i == i0); // true 数值比较
System.out.println(i == in1); // true 数值比较 拆箱变成int类型
System.out.println(i == in3); // true 数值比较 拆箱变成int类型
System.out.println(in1 == in2); // true 地址相同
System.out.println(in1 == in3); // false 地址不同
System.out.println(in3 == in4); // false 地址不同
System.out.println(in5 == in6); // false 超过[-128,127],重新new一个Integer对象