/*首先要知道的常识:
1.关系操作符==:计算"操作数"的 值 之间的关系,结果为true或者false;这操作数指的是所有的基本数据类型以及所有对象;
2.equals():是Object类中的方法,equals()作用和==相同,但是不适用于基本数据类型;
3.自己定义的类可以覆盖Object类中的equals();
*/
//下面来看一个例子:
class Da
{
/*此时a==b和a.equals(b)均为false; 因为a
和 b指向了不同的对象,虽然这两个对象的内容相同;*/
//int c;
//Da(int c){this.c=c;}
//static Da a=new Da(5); //
//static Da b=new Da(5); //
/*此时a==b为false;a.equals(b)为true;前者因为a和b的值不一样,指向了不同的对象;
后者因为Integer覆盖了Object类中的equals(),此时equals()比较的是Integer的对象的内容,也即int值;
*/
//static Integer a=new Integer(5);
//static Integer b=new Integer(5);
/*此时a==b和a.equals(b)均为true;现在问题来是:
在jdk1.5以后,可以使用自动装箱机制,我用的是jdk1.8,那么Integer a=5;是和Integer a = new Integer(5);一样的
那为啥结果就和上面的不一样呢?请高手赐教,多谢了。
*/
static Integer a=5;
static Integer b=5;
public static void main(String[] args)
{
System.out.println(a==b);
System.out.println(a.equals(b));
}
}
System.out.println(a==b);
这个结果为true,根本原因是java的包装类Integer使用了缓存,对包装类的自动装箱、自动拆箱也是一种语法糖, Java的new Integer操作,当参数值在【-128,127】之间时,new操作返回的对象是有缓存的,你使用的5在这个范围内,所以使用的是ab是同一个对象,但是如果改下:
static Integer a=256;
static Integer b=256;
public static void main(String[] args)
{
System.out.println(a==b);
System.out.println(a.equals(b));
}
那么此时a==b就是false,就不是同一个对象 了。
Integer a = 5 ;生成了一个对象
Integer a = new Integer();
a= 5 ;生成两个对象