public void test(){
int a=10;
Integer b=new Integer(10);
Integer d= Integer.valueOf(10);
Integer e= Integer.valueOf(10);
Integer c=10;
Integer f=10;
System.out.println(a==b);//b自动拆箱int。基本类型比较值 true
System.out.println(a==c);//将右边的1自动装箱,然后将c自动拆箱比较值true
System.out.println(c==b);//b,c都是引用类型,比较地址。指向不同对象 false
System.out.println(c.equals(b));//都是引用数据类型,重写equals。比较的是值true
System.out.println(c.equals(a));//首先将a自动装箱。相同的对象相同的值。true
System.out.println(c.equals(new Float(10)));//对象不同值相同。false
System.out.println(c.equals(new Integer(1)));//对象相同但是值不同false
System.out.println(a==d);//含有基本数据类型时,将包装类自动拆箱比较值true
System.out.println(d.equals(e));//同类型同值true
System.out.println(d==e);//比较地址。-128<value<127是创建了相同对象。true
System.out.println(d==f);//true
}
主要涉及的就是自动装,拆箱。以及Integer重写的equals方法和自己带的valueof方法。
==:对于基本的数据类型(8种,String不是),比较的是值
对于引用数据类型(除基本类型以外),比较的是地址。也即两个引用是否指向同一个对象。
equals:对于重写了object下的equals方法来说,大部分比较的是值(若是自己定义的类没有重写,则比较的仍是地址)。注意比较得是值的有一个前提就是两个比较的是同一类型。这可以在重写的equals源码中看见(Integer)
源码: public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
valueof:对于该方法需要注意的是它在[-128,127]内创建是同一个对象,这是JVM为了便于提高效率决定的。在源码中可以看见(Integer为例)
源码:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}。