经典问题: ==和equals的比较
== 是一个比较运算符,既可以判断基本类型,又可以判断引用类型,如果判断的是基本类型,判断的是值是否相等,如果判断引用类型,判断的是地址是否相等(判定是不是同一个对象)
如果忘记基本类型和引用类型可参考我这篇文章JAVA中两种数据类型(基本类型和引用类型)方法传参和对象传参的比较
equals: 是Object类中的方法,只能判断引用类型,默认判断地址是否相等,子类往往重写该方法,用于判断内容是否相等
String str1=new String("hello");//String重写了equals方法
String str2=new String("hello");
System.out.println("str1==str2);//输出结果为false,因为二者是两个不同的对象
System.out.println("str1.equals(str2));//输出结果为true,因为两个字符串值相等
下面一段代码会加深你对equals和==的区别
class Person{//创建一个类
public String name;
}
Person p1=new Person();
p1.name="hello";
Person p2=new Person();
p2.name="hello";
System.out.println(p1==p2); //False,p1和p2是引用类型,==判断引用类型时判断的是地址是否相等(是不是同一个对象)很显然,p1和p2不是同一个对象
System.out.println(p1.name.equals(p2.name));//True,p1.name和p2.name是String类型,equals默认被重写了,所以此时equals比较的是p1.name和p2.name的值是否相等
System.out.println(p1.equals(p2));//false,p1和p2此时未被重写,所以判断的是两者的地址或者说是否为同一个对象,很显然false
String s1=new String("abcd");
String s2=new String("abcd");
System.out.println(s1.equals(s2));//true,s1和s2是String类型,所以比较的是两者的值,都是"abcd"故正确
System.out.println(s1==s2);//false,==判断引用类型比较的是地址或是不是同一个对象,不是同一个地址所以输出false