==和equals的区别
本笔记来源于周阳老师大厂面试题,视频地址:https://www.bilibili.com/video/BV15J4112785
public class Test {
public static class Person{
private String name;
public Person(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
}
public static void main(String[] args) {
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
Set<String> set01 = new HashSet<>();
set01.add(s1);
set01.add(s2);
System.out.println(set01.size());
System.out.println("============");
Person p1 = new Person("abc");
Person p2 = new Person("abc");
System.out.println(p1 == p2);
System.out.println(p1.equals(p2));
Set<Person> set02 = new HashSet<>();
set02.add(p1);
set02.add(p2);
System.out.println(set02.size());
}
}
程序执行结果:
原理分析:
- ==比较的是栈中的地址,如果是基本类型,就是比较的基本类型的值。
- equals是一个属于object类的方法。如果equals方法不被重写,那么它和==是同样的效果。在重写equals方法时,为了避免两个equals相同的类hashcode不同,必须同时重写hashcode方法。详见:https://blog.csdn.net/gkmmg/article/details/80296238
- String是引用类型,栈中存放的是指向堆的地址,所以用==比较会返回false。
- String类重写了equals方法,使其可以比较字符串中的内容。
- Set中存放的对象是无序、无重复的,所以在存入Set之前,会调用hashcode和equals比较两个对象是否相等。String重写了equals和hashcode方法,所以s1和s2是相等的,因此set01的size为1。
- Person类没有重写equals方法,所以set02.size()为2。