“==”和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