==和equals区别
结论:如果equals方法没有被重写,那就和==没区别
-
用== 比较的两个变量是否相等,它比较的是变量中的值是否相等
int a = 10 ; int b = 10 ; int c = 20; System.out.println(a==b);// true System.out.println(a==c);// false System.out.println(b==c);// false String s1= "a"; String s2= "a"; String s3= "b"; System.out.println(s1==s2);// true System.out.println(s1==s3);// false System.out.println(s2==s3);// false
-
如果用==比较两个引用,它比较的是引用中存储的内存地址,而不是内存地址指向的实际对象。
Integer a = new Integer(10); Integer b = new Integer(10); System.out.println(a==b);//false String s1 = new String ("hello"); String s2 = new String ("hello"); System.out.println(s1==s2);//false
结论:==只能解决变量之间的比较问题,无法解决引用之间的比较问题。
那好,我们来使用equals解决引用比较的问题。
-
自己创建一个Student 类做测试(没有重写equals方法)
public class Student { private String id ; private String name ; private String address ; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Student{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", address='" + address + '\'' + '}'; } }
equals方法测试:
Student s1 = new Student(); Student s2 = new Student(); s1.setName("提莫"); s2.setName("提莫"); System.out.println(s1.equals(s2));//false
Student继承父类Object,Student没有重写equals方法,使用时调用了父类的equals方法,object的equals方法比较的还是引用的内存地址是否==
-
我们来测试一下String的equals方法
String a = new String ("hello"); String b = new String ("hello"); System.out.println(a.equals(b));//true
String的equals方法竟然可以比较引用是否相等!因为String重写了equals方法
所以:重写的equals方法既可以解决两个变量比较的问题,也可以解决两个引用进行比较的问题。
验证了开始的结论,结束!