==和equals()有什么区别?

Object类提供的equals()方法,默认是用==来进行比较的,也就是说只有两个对象是同一个对象时,才能返回相等的结果,在实际使用中,一般会重写定义的Class的equals方法
以下是Object中的equals()方法实现:

public boolean equals(Object obj) {
return (this == obj);
}

使用==进行比较

  • 作用于基本数据类型(byte,short,char,int,long,float,double,boolean)时比较他们之间的值是否相等;
  • 作用于引用数据类型时,是比较两个对象的内存地址是否相同,既判断它们是否为同一个对象;
    引用数据类型,比较的是他们在堆内存地址是否相等。每新new一个引用类型的对象,会重新分配堆内存空间,使用==比较返回false;

使用equals()方法进行比较

  • 没有重写时,Object默认用==实现,既比较两个对象的内存地址是否相同;
  • 进行重写后,一般会按照对象中的内容来进行比较,若两个对象内容相同则认为对象相同,否则认为对象不等,比如:String类
public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
return (anObject instanceof String aString)
    && (!COMPACT_STRINGS || this.coder == aString.coder)
    && StringLatin1.equals(value, aString.value);
}

例题:

public class StringDemo {
    public static void main(String[] args) {
        String a = new String("ab"); //a为一个引用
        String b = new String("ab"); //b为另一个引用,对象的内容一样
        String aa = "ab"; //放在常量池中
        String bb = "ab"; //从常量池中查找
        if(aa == bb) //true
        System.out.println("aa==bb");
        if(a == b) //false 非同一对象
        System.out.println("a==b");
        if(a.equals(b))//true
        System.out.println("a.equals(b)");
        if(22 == 22.0)//true
        System.out.println("true");
        if(a == aa)//false
        System.out.println("a == aa");
        if(a.equals(aa))//true
        System.out.println("a.equals(aa)");
    }
}

补充:
当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象