java学习之== 和 equals区别

运算符 == 和 equals()的区别

在基本数据类型中 运算符 == 比较的是两个变量的值,equals()方法不能比较基本数据类型,
引用类型的比较,运算符 == 比较的是两个变量的地址,equals()方法比较的也是地址。在Object类中equals的原码也是用的==。

java学习之== 和 equals区别

在某些特殊的类中,比如经常使用的String和一些包装类(Integer,Character等),在源码中重写了equals方法,所以其比较的是两个变量的值是否相等。下面的事String的原码,可以看到首先判断两个的地址,如果相等,那么值肯定相等,之后的代码块
if(v1[i] != v2[i])
     return false;
判断两个字符串的内容是否相等。其他的包装类都差不多。

java学习之== 和 equals区别

一些例子

1.String 的简单比较。

str1 和 str2 是字符串常量所产生的变量,所以两个变量指向同一个地址。

java学习之== 和 equals区别

2.new String()之间的比较

String str1 = new String("abc");
String str2 = new String("abc");
str1 == str2 比较的是二者之间的地址,str1 和 str2 是在堆上new出来的不同地址,所以是false。
str1.equals(str2);比较的是二者之间的值,都是"abc"所以是true.

java学习之== 和 equals区别

3.StringBuffer

StringBuffer s1 = new StringBuff("a");
StringBuffer s2 = new StringBuff("a");
StringBuffer类没有重写equals方法,所以其比较的仍然是地址。s1.equals(s2) 返回值是false。

java学习之== 和 equals区别

注意:

1.对于基本数据类型不能使用equals() 方法,只能使用 == 运算符

java学习之== 和 equals区别

可以看到在强行写equals方法之后会报错,没有这个方法,之后系统提示的方法是Objects.equals(a,b);我查看了一下这个函数的源代码,还是比较a和b的地址。

java学习之== 和 equals区别