java学习之== 和 equals区别
运算符 == 和 equals()的区别
在基本数据类型中 运算符 == 比较的是两个变量的值,equals()方法不能比较基本数据类型,
引用类型的比较,运算符 == 比较的是两个变量的地址,equals()方法比较的也是地址。在Object类中equals的原码也是用的==。
在某些特殊的类中,比如经常使用的String和一些包装类(Integer,Character等),在源码中重写了equals方法,所以其比较的是两个变量的值是否相等。下面的事String的原码,可以看到首先判断两个的地址,如果相等,那么值肯定相等,之后的代码块
if(v1[i] != v2[i])
return false;
判断两个字符串的内容是否相等。其他的包装类都差不多。
一些例子
1.String 的简单比较。
str1 和 str2 是字符串常量所产生的变量,所以两个变量指向同一个地址。
2.new String()之间的比较
String str1 = new String("abc");
String str2 = new String("abc");
str1 == str2 比较的是二者之间的地址,str1 和 str2 是在堆上new出来的不同地址,所以是false。
str1.equals(str2);比较的是二者之间的值,都是"abc"所以是true.
3.StringBuffer
StringBuffer s1 = new StringBuff("a");
StringBuffer s2 = new StringBuff("a");
StringBuffer类没有重写equals方法,所以其比较的仍然是地址。s1.equals(s2) 返回值是false。
注意:
1.对于基本数据类型不能使用equals() 方法,只能使用 == 运算符
可以看到在强行写equals方法之后会报错,没有这个方法,之后系统提示的方法是Objects.equals(a,b);我查看了一下这个函数的源代码,还是比较a和b的地址。