【“==”与equals的区分】

“==”和equals
 
 
简单来说,“==”是关系运算符,而equals()是方法,不过他们的返回结果都是boolean(布尔类型)
 
详细的说:
1. “==” 可以比较值(两侧是基本类型),也可以比较地址,也就是比较两个对象在内存中的地址是否相同(两侧是引用类型),
基本数据类型包括:boolean,char,short,int,long,float,double(注意string类型不是基本数据类型)
引用类型:Map。。(引用类型就是除了基本数据类型之外的所有类型,也包括class类型)
另外数据类型比较一般都是用 ==,不过String类型比较一般都是equals
 
2.“equals”如果没有经过重写,只是引用object的equals方法,那么可以理解为equals和==是一样的功能——比较地址
如果重写过,那就根据重写内容来比较
 
如果举例来说:
  使用“==”  ,对于基本数据类型,就是比较变量的值是否相等,比如:int a = 6; int b = 3; a==b;返回就是false,这个大家都很熟悉
 如果是引用类型,就是比较地址   String a = new String(“abc”) ; String b = new String(“abc”);  这种情况下创建出来的”abc”对象会被存储到堆,
 a和b指向的“abc”分别存储到堆内存的不同位置。a和b里面保存的是”abc”在堆里面的内存首地址,这两个地址明显是不同的,所以我们在做 a==b操作的时候返回的为false
 
 
  使用“equals” ,如果类中没有重写过方法,那就是比较地址  
 
如果不明白可以看看下面的实例:实践出真知啦
public class equals {

    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("aa");
        StringBuffer b = new StringBuffer("aa");
        System.out.println(a.equals(b));//false
        System.out.println(a==b);//false

        System.out.println("+++++分界线+++++");

        String s1 = new String("abc");
        String s2 = new String("abc");

        System.out.println(s1==s2);//false 两个变量的内存地址不一样,指向的对象不 一样,
        System.out.println( s1.equals(s2));//true    //两个变量的所包含的内容是abc,故相等。



    }
}

代码输出如下:

false

false
+++++分界线+++++
false
true

分析:

  前两个sout打印false是因为StringBuffer类中没有重写过equals方法,所以本质还是比较对象,而对象不同所以分配的内存地址也不一样的,所以是false

  后两个一个false,一个true,是因为String类重写了equals方法(感兴趣的可以去看看,idea中对着String左键单击就好),所以equals比较的是字符串内容,返回结果是true
原文地址:https://www.cnblogs.com/dabuliu/p/14427774.html