int和Integer的区别:
1、int是基本数据类型,存储的是数值,默认是0
2、Integer是int的包装类,存放的是对象的引用,必须实例化之后才能使用,默认是null
int和Integer比较
== 地址比较
1、int对象赋给Integer对象,int会自动装箱成Integer,实际上是调用了Integer.valueOf(int),如果数值范围在-128到127会默认从常量池获取对象,引用地址相同;超过范围会new对象,在堆中重新分配内存。
2、int 和 Integer 比较时,会自动进行Integer的拆箱操作,即比较的是数值,相同数值的肯定相同。
3、凡是new出来的对象,都在堆中重新分配内存,引用地址必然不相同。
equals 数值的比较
object.java中equals 中实际上是实现的地址比较==,Integer重写了equals(),比较的是数值,equals 相同。
- Integer.valueOf() 享元模式,在 -128到127区间内,共享一份实例。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
复制代码
- Integer.equals()
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
复制代码
Integer.class
public final class Integer extends Number implements Comparable<Integer> {
private final int value; // Integer里面包含的值
}
复制代码
笔试题 == 、 equals
测试,结果均标记在下
public static void compareInt2Integer() {
/**
* i、j实际上都是调用了 Integer.valueOf(128)
* 都是从常量池取的,所有内存地址一样,true
*/
Integer i = 127;
Integer j = 127;
System.out.println(i == j); // true
System.out.println(i.equals(j)); // true
/**
* m、n 实际上都是调用了 Integer.valueOf(128),进行自动装箱操作
* m、n 都是新创建的对象,会在堆中重新分配内存,地址不同,false
*/
Integer m = 128;
Integer n = 128;
System.out.println(m == n); //false
System.out.println(m.equals(n)); //true
/**
* k取的是缓存,h是新创建的对象,false
*/
Integer k = 127;
Integer h = new Integer(127);
System.out.println(k == h); //false
System.out.println(k.equals(h));//true
/**
* new 操作符会分配内存,a、b都是新创建的对象
* == 比较的是引用的地址,false
*/
Integer a = new Integer(127);
Integer b = new Integer(127);
System.out.println(a == b); //false
System.out.println(a.equals(b)); //true
/**
* Integer.valueOf() 会优先判断常量池缓存,缓存范围是-128到127,超过范围会new一个对象,
* w 实际也是调用了 Integer.valueOf(128)
* w、y 都是新创建的对象 false
*/
Integer w = 128;
Integer y = Integer.valueOf(128);
System.out.println(w == y); // false
System.out.println(w.equals(y)); //true
/**
* Integer和int比较,Integer会自动拆箱成int,数值比较,true
*/
Integer x = 128;
int z = 128;
System.out.println(x == z); //true
System.out.println(x.equals(z)); //true
}
复制代码