“==”和equals方法区别:
双等号“ == ”,对于基本数据类型,比较的是它们的值。
对于非基本类型,比较的是它们在内存中的存放地址,或者说是比较两个引用是否引用内存中的同一个对象。
equals方法没有在类中被override时,比较的还是对象在内存中的地址;如果被override,一般是比较对象中的成员是否相同。
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a == b);
//返回false
原因:Integer a =1是自动装箱,会调用Integer.valueOf(int)方法
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a.equals(b));
//返回true
原因:Integer的equals中比较的是值,因此只要对象的自动包装类相同,且值相同,那么调用equals返回true
对于语句Integer a = 1; Integer变量指向的是 java 常量池中的对象;
对于Integer a = new Integer(1);Integer变量指向的是堆中新建的对象,地址不同
Integer a = 1;
//Integer是包装类型,1为整型常量,由于auto-boxing,a为Integer的引用,指向1这个整型常量所占用的内存。以上语句,会调用Integer的valueOf()方法。valueOf()方法就是将int类型转换为Integer,也就是装箱,返回一个Integer对象。同时valueOf()在返回之前会进行判断,判断当前常量的值是否在-128~127之间,如果存在,就直接返回引用(IntegerCache.cache[]中的某个对象),不再重新开辟内存空间;否则创建一个新的对象。;
//也就是说如果Integer a = 200;会创建一个新的Integer对象
Integer b = 1;
System.out.println(a == b);
//返回true
Integer a = 1;
Integer b = 1;
System.out.println(a.equals(b));
//返回true
原因:Integer的equals中比较的是值,因此只要对象的自动包装类相同,且值相同,那么调用equals返回true
Integer a = new Integer(1);
int b = 1;
System.out.println(a==b);
//true
Integer a = 1;
int b = 1;
System.out.println(a==b);
//true
以上,不管是不是new操作产生的Integer,在于int基础类型进行比较时,会自动拆包,变为int,最后就是两个int变量进行比较。