equals和==经常用来去比较两个值或者两个对象。
==如果只是用来比较基本数据类型常量的话,那么比较的就是两个常量的值,如果用来去比较两个对象引用,那么比较的是两个对象的地址。equals在java中一般都是比较两个对象的值,前提是java提供的类中重写了equals这一方法(绝大多数equals方法在java类中均被重写)。
当str1和str2都是引用类型
public static void main(String[] args) {
String str1 = new String("aaa");
String str2 = new String("aaa");
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
}
如上面代码,当new两个String类对象时,new String("aaa")分别在常量池创建了"aaa"对象,然后在堆内存new了对象str,对象成员变量赋予aaa的值。
因而new两次对象后,堆内存中的str1和str2分别是两个不同的对象,地址不相同,值相同,最后equals比较返回值相等为true。当用==去比较时,因为两个对象地址不同因而输出为false。
当str1和str2都是常量时的情况
public static void main(String[] args) {
String str1 = "aaa";
String str2 = "aaa";
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
}
如果在自己写的类中equals方法没有被重写的话,默认还是比较地址,相当于==。
class Animal{
private String type;
public Animal(String type) {
this.type = type;
}
}
public class test35 {
public static void main(String[] args) {
Animal animal1=new Animal("cat");
Animal animal2=new Animal("dog");
System.out.println(animal1.equals(animal2));
}
}
如上面代码,自己构造的类中如果没有去重写equals方法则默认还是比较地址,因而返回false。
特殊情况
public static void main(String[] args) {
int i=0;
Integer j=new Integer(0);
Integer k=new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
System.out.println(j==k);
System.out.println(j.equals(k));
}
当 i 是一个基本数据类型,j 作为一个包装引用类型时,i 和 j 使用 == 进行比较时,j会进行自动拆箱,变成一个基本类型:0,因而==比较返回结果为true。
j 和 k 都是包装引用类型时,没有拆箱操作,== 比较的仍然是j和k的地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)