概念:
== : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系
equals : Object的实例方法,比较两个对象的content是否相同
关系操作符==
基本数据类型变量
对于基本数据类型变量,变量直接存储的是“值”,使用关系操作符来进行比较时,比较的就是“值”本身
引用类型变量
在Java中,引用类型的变量存储的并不是“值”本身,而是与其指向的对象在内存中的地址(关于对象引用的内容,不了解请查看这篇博客:https://blog.csdn.net/lxl121181/article/details/80483657)
所以关系操作符判断的是左右两边操作数的内存地址是否相同,若返回true,则该操作符作用的一定是同一个对象
equals方法
Java语言里的euqals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是euqal的
所以我们不能单纯的说euqals到底比较的是什么。你想知道一个类的equals方法是什么意思就要去看定义
Object类中equals方法实现如下:
public boolean equals(Object obj) { return (this == obj); }
很显然,在Object类中,equals方法时用来比较两个对象的引用是否相等,即是否指向同一个对象
而String类则覆写了这个方法
public boolean equals(Object anObject) { if (this == anObject) { // 1.先判断引用是否相同(是否为同一对象), return true; } if (anObject instanceof String) { //2. 再判断类型是否一致, // 3.最后判断内容是否一致. String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
Java语言规范要求euqals方法具有下面的特性:
对称性: 对于任何引用x和y,当且仅当x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true” ;
自反性: 对于任何非空引用x,x.equals(x)应该返回“true” ;
传递性: 对于任何引用x和y,如果x.equals(y)返回是“true”,y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true” ;
一致性: 如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果
对于任意非空引用x,x.equals(null)应该返回false。